diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 544865fd..987f2b70 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -145,6 +145,7 @@ class AccountController < ApplicationController @com_coop_img = CooImg.where(:img_type => 'com_coop').order("position asc") @edu_coop_img = CooImg.where(:img_type => 'edu_coop').order("position asc") + @alliance_img = CooImg.where(:img_type => 'alliance_coop').order("position asc") render :layout => 'base_edu' end @@ -152,6 +153,7 @@ class AccountController < ApplicationController def update_help @edu_coop = "edu_coop" @com_coop = "com_coop" + @alliance_coop = "alliance_coop" end def update_agreement @@ -232,7 +234,7 @@ class AccountController < ApplicationController end if File.exist?(diskfile1) pos = CooImg.order("position asc").last.position - CooImg.create(:src_states =>params[:img_url] ,:url_states => diskfile2,:img_type =>params[:sourse_type], :position => pos) + CooImg.create(:src_states =>params[:img_url] ,:url_states => diskfile2,:img_type => params[:sourse_type], :position => pos) end redirect_to help_path(:index => 3) end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c3865f3f..601ebb8a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -66,6 +66,8 @@ class ApplicationController < ActionController::Base include Redmine::MenuManager::MenuController helper Redmine::MenuManager::MenuHelper + helper_method :admin_or_business? + # 云启训练场(EduCoder)个人版 产品编码(appId) 9200108 # 产品名称 计费类型 套餐编码 # 云启训练场(EduCoder)个人版 固定包月 9200108001 @@ -133,7 +135,7 @@ class ApplicationController < ActionController::Base end def ec_public_auth major_school - unless User.current.admin? || major_school.template_major || major_school.school.users.where(:id => User.current.id).count > 0 || + unless admin_or_business? || major_school.template_major || major_school.school.users.where(:id => User.current.id).count > 0 || major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 || EcCourseUser.where(:user_id => User.current.id, :ec_course_id => EcCourse.where(:ec_year_id => major_school.ec_years.pluck(:id)).pluck(:id)).count > 0 render_403 @@ -376,7 +378,7 @@ class ApplicationController < ActionController::Base def require_admin return unless require_login - if !User.current.admin? && @shixun.status > 1 + if !User.current.admin? render_403 return false end @@ -390,6 +392,10 @@ class ApplicationController < ActionController::Base end end + def admin_or_business? + User.current.business? || User.current.admin? + end + def deny_access User.current.logged? ? render_403 : require_login end diff --git a/app/controllers/ec_course_achievement_methods_controller.rb b/app/controllers/ec_course_achievement_methods_controller.rb index ecc74a67..5dcdfea8 100644 --- a/app/controllers/ec_course_achievement_methods_controller.rb +++ b/app/controllers/ec_course_achievement_methods_controller.rb @@ -309,7 +309,7 @@ class EcCourseAchievementMethodsController < ApplicationController @ec_course = EcCourse.find(params[:ec_course_id]) @year = @ec_course.ec_year @ec_major_school = @year.ec_major_school - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) @is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end diff --git a/app/controllers/ec_course_evaluations_controller.rb b/app/controllers/ec_course_evaluations_controller.rb index bf47d16e..f2a54e6f 100644 --- a/app/controllers/ec_course_evaluations_controller.rb +++ b/app/controllers/ec_course_evaluations_controller.rb @@ -298,7 +298,7 @@ class EcCourseEvaluationsController < ApplicationController def find_course @ec_course = EcCourse.find params[:ec_course_id] ec_major_school = @ec_course.ec_year.ec_major_school - @is_manager = User.current.admin? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @is_manager = admin_or_business? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end @@ -306,7 +306,7 @@ class EcCourseEvaluationsController < ApplicationController @ce = EcCourseEvaluation.find params[:id] @ec_course = @ce.ec_course ec_major_school = @ec_course.ec_year.ec_major_school - @is_manager = User.current.admin? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @is_manager = admin_or_business? || ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end end diff --git a/app/controllers/ec_course_supports_controller.rb b/app/controllers/ec_course_supports_controller.rb index 6bb0288b..39b7d06b 100644 --- a/app/controllers/ec_course_supports_controller.rb +++ b/app/controllers/ec_course_supports_controller.rb @@ -50,7 +50,7 @@ class EcCourseSupportsController < ApplicationController max_support_count = 0 subitems_count = 0 major_school = @year.ec_major_school - is_manager = User.current.admin? || major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) + is_manager = admin_or_business? || major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) ec_graduation_requirements.each_with_index do |gr, i| logger.info("#############index:#{i}#####_ec_gradiation_reqiorements: #{gr.id}") subitems_count += gr.ec_graduation_subitems.count diff --git a/app/controllers/ec_courses_controller.rb b/app/controllers/ec_courses_controller.rb index e7e000bb..8ad9f4e4 100644 --- a/app/controllers/ec_courses_controller.rb +++ b/app/controllers/ec_courses_controller.rb @@ -346,7 +346,7 @@ class EcCoursesController < ApplicationController # 关联课堂弹框-搜索 def search_courses user = User.where(:id => params[:user_id]).first - if user.try(:admin?) + if user.try(:admin?) || user.try(:business?) courses = Course.where(:is_delete => 0) else course_ids = Member.where("user_id = #{user.try(:id)} and course_id != -1").pluck(:course_id) @@ -588,7 +588,7 @@ class EcCoursesController < ApplicationController @ec_course = EcCourse.find(params[:id]) @year = @ec_course.ec_year @ec_major_school = @year.ec_major_school - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) @is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end @@ -596,7 +596,7 @@ class EcCoursesController < ApplicationController def find_year @year = EcYear.find(params[:ec_year_id]) @ec_major_school = @year.ec_major_school - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) #@is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id) end diff --git a/app/controllers/ec_graduation_requirements_controller.rb b/app/controllers/ec_graduation_requirements_controller.rb index ea0f5464..091588cd 100644 --- a/app/controllers/ec_graduation_requirements_controller.rb +++ b/app/controllers/ec_graduation_requirements_controller.rb @@ -34,7 +34,7 @@ class EcGraduationRequirementsController < ApplicationController ActiveRecord::Base.transaction do @year = EcYear.find params[:year_id] position = @year.ec_graduation_requirements ? @year.ec_graduation_requirements.count + 1 : 1 - @template_major = User.current.admin? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) + @template_major = admin_or_business? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) ec_requirement_id = EcGraduationRequirement.create(content: params[:requirement], :ec_year_id => @year.id, :position => position) params[:subitems].try(:each_with_index) do |sub, index| EcGraduationSubitem.create(content: sub, ec_graduation_requirement_id: ec_requirement_id.id, position: index+1) @@ -48,7 +48,7 @@ class EcGraduationRequirementsController < ApplicationController def update requirement = EcGraduationRequirement.find params[:id] @year = requirement.ec_year - @template_major = User.current.admin? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) + @template_major = admin_or_business? || @year.ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) requirement.update_attribute(:content, params[:requirement]) requirement.ec_graduation_subitems.destroy_all params[:subitems].try(:each_with_index) do |sub, index| diff --git a/app/controllers/ec_major_schools_controller.rb b/app/controllers/ec_major_schools_controller.rb index 445ce70f..dfeb9ce4 100644 --- a/app/controllers/ec_major_schools_controller.rb +++ b/app/controllers/ec_major_schools_controller.rb @@ -13,7 +13,7 @@ class EcMajorSchoolsController < ApplicationController # 这个status 用于创建界别时,局部刷新的状态 @status = params[:status] - @btn_text = @major_school.template_major && User.current.admin? ? "立即配置" : + @btn_text = @major_school.template_major && admin_or_business? ? "立即配置" : (!@major_school.template_major && @major_manager ? "立即配置" : "查看") if params[:search] @@ -84,7 +84,7 @@ class EcMajorSchoolsController < ApplicationController user_url = user_path(User.current) year = @year.year # 学校操作权限 - template_major = User.current.admin? || major.school.ec_school_users.pluck(:user_id).include?(User.current.id) + template_major = admin_or_business? || major.school.ec_school_users.pluck(:user_id).include?(User.current.id) # 示例专业 example_major = major.template_major ec_course_support_setting_url = ec_course_support_setting_ec_course_path(ec_course) if ec_course.present? @@ -130,7 +130,7 @@ class EcMajorSchoolsController < ApplicationController competition_calculation_info_url: competition_calculation_info_url, score_level_setting_url: score_level_setting_url, example_major: example_major, - allow_visit: User.current.admin? || (User.current.ec_school.present? && User.current.ec_school == major.school.id) + allow_visit: admin_or_business? || (User.current.ec_school.present? && User.current.ec_school == major.school.id) } end @@ -159,7 +159,7 @@ class EcMajorSchoolsController < ApplicationController end def add_manager - @is_school_manager = User.current.admin? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 + @is_school_manager = admin_or_business? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 if @is_school_manager || @major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 params[:user_id].each do |user_id| if @major_school.ec_major_school_users.count < 5 && @major_school.ec_major_school_users.where(:user_id => user_id).count == 0 @@ -172,7 +172,7 @@ class EcMajorSchoolsController < ApplicationController end def delete_manager - @is_school_manager = User.current.admin? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 + @is_school_manager = admin_or_business? || @major_school.school.users.where(:id => User.current.id).count > 0 # 学校管理员 if @is_school_manager || @major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 @major_school.ec_major_school_users.where(:user_id => params[:user_id]).destroy_all else @@ -184,7 +184,7 @@ class EcMajorSchoolsController < ApplicationController def find_major_school @major_school = EcMajorSchool.find(params[:id]) # 管理员权限 - @major_manager = User.current.admin? || @major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) + @major_manager = admin_or_business? || @major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) end # 职业认证的权限判断 diff --git a/app/controllers/ec_years_controller.rb b/app/controllers/ec_years_controller.rb index 548e3b6e..6baf5d58 100644 --- a/app/controllers/ec_years_controller.rb +++ b/app/controllers/ec_years_controller.rb @@ -25,7 +25,7 @@ class EcYearsController < ApplicationController @status = 1 end @major_manager = true - @btn_text = @major_school.template_major && User.current.admin? ? "立即配置" : + @btn_text = @major_school.template_major && admin_or_business? ? "立即配置" : (!@major_school.template_major && @major_manager ? "立即配置" : "查看") @years = EcYear.where(:ec_major_school_id => @major_school.id) @years = paginateHelper @years, 10 @@ -338,7 +338,7 @@ class EcYearsController < ApplicationController @ec_major_school = EcMajorSchool.find(params[:ec_major_school_id]) @year = EcYear.find(params[:id]) # 专业管理员身份 - @template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) + @template_major = admin_or_business? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id) end # 职业认证的权限判断 diff --git a/app/controllers/ecs_controller.rb b/app/controllers/ecs_controller.rb index 172d13fc..5d391a5d 100644 --- a/app/controllers/ecs_controller.rb +++ b/app/controllers/ecs_controller.rb @@ -7,7 +7,7 @@ class EcsController < ApplicationController def department @template_major = EcMajorSchool.where(:template_major => true).first @school_managers = @school.users - @is_school_manager = User.current.admin? || @school.users.where(:id => User.current.id).count > 0 # 学校管理员 + @is_school_manager = User.current.admin? || User.current.business? || @school.users.where(:id => User.current.id).count > 0 # 学校管理员 @major_schools = @school.ec_major_schools.where(:template_major => false) unless @is_school_manager @@ -70,7 +70,7 @@ class EcsController < ApplicationController end def school_manager - unless User.current.admin? || @school.users.where(:id => User.current.id).count > 0 + unless User.current.admin? || User.current.business? || @school.users.where(:id => User.current.id).count > 0 render_403 end end diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index 13c24a3e..483a4ff3 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -2,11 +2,10 @@ class ManagementsController < ApplicationController before_filter :require_business before_filter :require_admin, :only => [:shixun_setting_list, :mirror_repository, :mirror_picture_shixuns, :editmd_template, - :editmd_template, :subject_level_system, :subject_setting_list, :auto_users_trial, - :evaluate_records, :identity_authentication, :identity_authentication, :professional_authentication, - :shixun_authorization, :graduation_standard, :ec_template, :codemirror_template, + :editmd_template, :subject_level_system, :subject_setting_list, + :shixun_authorization, :ec_template, :codemirror_template, :course_guide_template, :shixun_quality_score, :tech_system, :update_notice, :setting_banner, - :training_2018] + :training_2018, :create_standard] layout 'base_management' include ManagementsHelper include SortHelper @@ -32,6 +31,15 @@ class ManagementsController < ApplicationController # 实训课程等级体系 def subject_level_system @levels = SubjectLevelSystem.all + respond_to do |format| + format.js + format.html + format.xls{ + time = Time.now.strftime("%Y%m%d") + filename = "实训课程体系#{time}.xls" + send_data(export_subject_level_system(), :type => 'application/octet-stream', :filename => filename_for_content_disposition(filename)) + } + end end # 创建课程等级体系 @@ -4152,7 +4160,7 @@ end sheet1 = book.create_worksheet :name => "sheet" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue - sheet1.row(0).concat(["姓名", "手机号","邮箱","单位名称", "职位","专业", "学号", "支付方式","支付状态","支付时间", "发票类型", "发票抬头","税务登记号", "发票内容", "备注", "微信支付单号", "报名时间"]) + sheet1.row(0).concat(["姓名", "手机号","邮箱","单位名称", "职位","专业", "学号", '授课/研究领域', "支付方式","支付状态","支付时间", "发票类型", "发票抬头","税务登记号", "发票内容", "备注", "微信支付单号", "报名时间"]) count_row = 1 trainings.find_each do |t| sheet1[count_row, 0] = t.name @@ -4162,16 +4170,17 @@ end sheet1[count_row, 4] = t.position sheet1[count_row, 5] = t.major sheet1[count_row, 6] = t.student_id - sheet1[count_row, 7] = t.training_payinfo.try(:pay_type_str) - sheet1[count_row, 8] = t.training_payinfo.try(:pay_status_str) - sheet1[count_row, 9] = format_time t.training_payinfo.try(:pay_time) - sheet1[count_row, 10] = t.training_payinfo.try(:invoice_title).present? ? '需要' : '不需要' - sheet1[count_row, 11] = t.training_payinfo.try(:invoice_title) - sheet1[count_row, 12] = t.training_payinfo.try(:invoice_no) - sheet1[count_row, 13] = t.training_payinfo.try(:invoice_content) - sheet1[count_row, 14] = t.training_payinfo.try(:info) - sheet1[count_row, 15] = t.training_payinfo.try(:out_trade_no) - sheet1[count_row, 16] = format_time t.created_at + sheet1[count_row, 7] = t.research_field + sheet1[count_row, 8] = t.training_payinfo.try(:pay_type_str) + sheet1[count_row, 9] = t.training_payinfo.try(:pay_status_str) + sheet1[count_row, 10] = format_time t.training_payinfo.try(:pay_time) + sheet1[count_row, 11] = t.training_payinfo.try(:invoice_title).present? ? '需要' : '不需要' + sheet1[count_row, 12] = t.training_payinfo.try(:invoice_title) + sheet1[count_row, 13] = t.training_payinfo.try(:invoice_no) + sheet1[count_row, 14] = t.training_payinfo.try(:invoice_content) + sheet1[count_row, 15] = t.training_payinfo.try(:info) + sheet1[count_row, 16] = t.training_payinfo.try(:out_trade_no) + sheet1[count_row, 17] = format_time t.created_at count_row += 1 end book.write xls_report @@ -4286,6 +4295,33 @@ end return sheet.rows end + def export_subject_level_system + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "实训课程等级体系" + blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 + sheet1.row(0).default_format = blue + count_row = 1 + sheet1.row(0).concat(["序号", "等级", "实训课程名称", "实训课程url", "实训名称"]) + levels = SubjectLevelSystem.includes(subjects: [stage_shixuns: :shixun]).where(nil) + levels.each_with_index do |level, i| + sheet1[count_row, 0] = i + 1 + sheet1[count_row, 1] = level.name + level.subjects.each do |subject| + sheet1[count_row, 2] = subject.name + sheet1[count_row, 3] = "#{Setting.protocol}://#{Setting.host_name}#{subject_path(subject)}" + count_row += 1 + subject.shixuns.each do |shixun| + sheet1[count_row, 4] = shixun.name + count_row += 1 + end + end + count_row += 1 + end + book.write xls_report + xls_report.string + end + def shixun_feedback_xls shixun_ids, beginTime, endTime xls_report = StringIO.new book = Spreadsheet::Workbook.new diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 96f45d3a..68e4b4b0 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -358,7 +358,7 @@ class MyshixunsController < ApplicationController def vnc vnc_password = Redmine::Configuration['vnc'] shixun_tomcat = Redmine::Configuration['shixun_tomcat'] - host = Redmine::Configuration['tomcat_php'] + host = Redmine::Configuration['vnc_url'] begin uri = "#{shixun_tomcat}/bridge/vnc/getvnc" shixun = @myshixun.shixun @@ -368,7 +368,7 @@ class MyshixunsController < ApplicationController raise("实训云平台繁忙(繁忙等级:99)") end # url = host + ":" + res['port'] + "?password=" + vnc_password - url = host +":#{res['port']}/vnc.html" + url = "https://#{res['port']}.#{host}/vnc.html" render :json => {:url => url} rescue Exception => e logger.error(e) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 56766264..e47938ac 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -10,7 +10,7 @@ class ShixunsController < ApplicationController before_filter :view_allow, :only => [:collaborators, :propaedeutics, :shixun_discuss, :ranking_list] before_filter :require_manager, :only => [ :settings, :add_script, :publish, :collaborators_delete, :shixun_members_added, :add_collaborators, :update, :destroy] before_filter :validation_email, :only => [:new] - before_filter :require_admin, :only => [:destroy] + #before_filter :require_manager, :only => [:destroy] # 移动云ToC模式权限控制 # before_filter :ecloud_auth, :except => [:show, :index] @@ -1117,6 +1117,7 @@ class ShixunsController < ApplicationController end def destroy + render_403 if @shixun.status > 1 && !User.current.admin? ActiveRecord::Base.transaction do g = Gitlab.client g.delete_project(@shixun.gpid) if @shixun.try(:gpid).present? diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 89fddb36..289c122b 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -496,7 +496,7 @@ class StudentWorkController < ApplicationController def _index # REDO:分班信息提前查出来,然后循环中根据匹配去取 - @is_teacher = User.current.logged? ? (User.current.allowed_to?(:as_teacher,@course) || User.current.admin?) : false + @is_teacher = User.current.logged? ? (User.current.allowed_to?(:as_teacher,@course) || User.current.admin? || User.current.business?) : false @member = @course.members.where(:user_id => User.current.id).first # 判断学生是否有权限查看(作业未发布、作业已发布但不是统一设置的未分班学生、分班设置的作业未发布) if User.current.member_of_course?(@course) && !@is_teacher diff --git a/app/controllers/trainings_controller.rb b/app/controllers/trainings_controller.rb index 8d3b6355..8650a5a7 100644 --- a/app/controllers/trainings_controller.rb +++ b/app/controllers/trainings_controller.rb @@ -3,54 +3,53 @@ require 'base64' class TrainingsController < ApplicationController wechat_responder - skip_before_filter :verify_signature, only: [:show, :create, :test] + skip_before_filter :check_if_login_required + skip_before_filter :verify_signature, except: [:auth, :auth_callback, :pay_callback] ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] - before_filter :find_training, only: [:show, :test] - before_filter :valid_training, only: [:pay, :result, :pay_js] + before_filter :check_training_type, only: [:enroll] + before_filter :check_current_training, only: [:show, :update, :pay, :pay_js, :update_payinfo, :result] layout 'base_trainings' - - TAG_ID = 'bigdata_hnjcxy_2019' - def show @training = current_training - url = nil - if @training && !@training.pay? - url = enroll_training_path(id: TAG_ID) - elsif @training && @training.pay? - url = result_training_path(id: TAG_ID) - else - url = enroll_training_path(id: TAG_ID) + if @training.training_payinfo.present? && !@training.training_payinfo.not_payed? && params[:disable_redirect].blank? + redirect_to result_training_path(id: friendly_id) + return end - redirect_to url + render 'trainingsInfo' end def enroll @training = current_training || Training.new - end + if params[:disable_redirect].blank? + if @training.training_payinfo.present? + redirect_to result_training_path(id: friendly_id) + return + end + unless @training.new_record? + redirect_to training_path(id: friendly_id) + return + end + end + end def pay - _pay_params - @training = current_training - # 防止重复支付,对于已支付过的,不应该再到这个页来 - if @training.payed? - redirect_to result_training_path(id: TAG_ID) - return + if @training.training_payinfo.blank? + @training.build_training_payinfo + @training.training_payinfo.fee = @training.registration_fee + @training.training_payinfo.pay_type = params[:pay_type].presence || 3 end - - @training.training_payinfo ||= TrainingPayinfo.new - end def pay_callback @@ -93,30 +92,29 @@ class TrainingsController < ApplicationController end def result - _pay_params @training = current_training - end + if @training.training_payinfo.blank? + redirect_to training_path(id: friendly_id) + return + end + end def create - @training = current_training || Training.new(params) - @training.training_type = Training::Training_Type + @training = Training.new + @training.training_type = @training_type @training.openid = session[:wechat_open_id] - @training.save! - redirect_to pay_training_path(id: TAG_ID) - end + save_training + redirect_to training_path(id: friendly_id, disable_redirect: true) + end def update @training = current_training - unless @training - render_404 - return - end + save_training - @training.update_attributes(params) - redirect_to pay_training_path(id: TAG_ID) + redirect_to training_path(id: friendly_id, disable_redirect: true) end @@ -126,49 +124,42 @@ class TrainingsController < ApplicationController # 采用ajax调用方式,返回支付参数 def update_payinfo @training = current_training - unless @training - render_404 - return - end - - _pay_params - - attachment = nil - if params[:image] - attachment = Attachment.create!(file: params[:image], author: User.first) - end - - #修改以前的订单信息 - training_info = @training.training_payinfo - if training_info.present? - training_info.update_attributes(params) - else - training_info = TrainingPayinfo.new(params) - end - - training_info.num = params[:enlistN].to_i - if training_info.num < 1 - training_info.num = 1 - end - - training_info.fee = (training_info.num * @pay_fee).to_i + training_info = @training.training_payinfo || @training.build_training_payinfo + training_info.assign_attributes(params) + + ActiveRecord::Base.transaction do + if training_info.pay_type.to_i == TrainingPayinfo::PayType_bank + attachment = nil + attachment = Attachment.create!(file: params[:image], author: User.first) if params[:image] + + if training_info.attachment.blank? && attachment.blank? && training_info.not_payed? + flash[:message] = '请先上传支付凭证' + render 'pay' + return + end - training_info.attachment = attachment if attachment.present? + training_info.attachment = attachment if attachment.present? + end - if training_info.pay_type.to_i == TrainingPayinfo::PayType_Wechat - training_info.status = TrainingPayinfo::Status_None - else - training_info.status = TrainingPayinfo::Status_Wait - end + if training_info.not_payed? + # 已支付不能修改人数 + training_info.num = params[:enlistNum].to_i < 1 ? 1 : params[:enlistNum].to_i + training_info.fee = @training.registration_fee(training_info.num) - training_info.training_id = @training.id + if training_info.pay_type.to_i == TrainingPayinfo::PayType_Wechat + training_info.status = TrainingPayinfo::Status_None + else + training_info.status = TrainingPayinfo::Status_Wait + end + end - training_info.save! + training_info.save! - if params[:js] == 'true' - _pay_js(training_info.fee) - else - redirect_to url = result_training_path(id: TAG_ID) + if params[:js] == 'true' && training_info.not_payed? + _pay_js(training_info.fee) + else + redirect_to result_training_path(id: friendly_id) + end end end @@ -180,6 +171,7 @@ class TrainingsController < ApplicationController attachment = Attachment.create!(file: params[:image], author: User.first) training_payinfo = @training.training_payinfo training_payinfo.attachment = attachment + training_payinfo.status = TrainingPayinfo::Status_Wait if training_payinfo.status == TrainingPayinfo::Status_None training_payinfo.save! render json: {status: 0} end @@ -193,6 +185,7 @@ class TrainingsController < ApplicationController #js获取支付参数 def _pay_js(fee) + Rails.logger.info("### start wechat pay => fee: #{fee}") @training = current_training js_function_call do out_trade_no = Wechat.pay.gen_trade_no @@ -201,7 +194,7 @@ class TrainingsController < ApplicationController # # 写入wechat_pay付费表 WechatPay.create!(training_id: @training.id, out_trade_no: out_trade_no) - render json: {status: 0, data: unifiedorder(out_trade_no, fee)} + render json: {status: 0, data: unifiedorder(out_trade_no, fee, @training.pay_order_title)} end end @@ -209,7 +202,7 @@ class TrainingsController < ApplicationController # 用于权限跳转 def auth state = params[:state] - url = "#{ROOT_URL}/trainings/auth_callback" + url = CGI.escape("#{ROOT_URL}/trainings/auth_callback?return_url=#{params[:return_url]}") authorize_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{url}&response_type=code&scope=snsapi_base&state=#{state}&connect_redirect=1#wechat_redirect" redirect_to authorize_url end @@ -221,26 +214,9 @@ class TrainingsController < ApplicationController render 'wechats/open_wechat', layout: nil and return end - session[:wechat_open_id] = open_id - # 考虑状态 - # 1. 无记录或未支付 - # 2. 已填写未付款 - # - @training = current_training - - url = '' - if !@training - url = training_path(id: TAG_ID) - elsif !@training.pay? - url = enroll_training_path(id: TAG_ID) - else - url = result_training_path(id: TAG_ID) - end - - redirect_to url - + redirect_to params[:return_url].present? ? params[:return_url] : '/' end def test @@ -248,40 +224,67 @@ class TrainingsController < ApplicationController end private - def _pay_params - @pay_fee = Redmine::Configuration['training_fee'].to_f || 5000 - end def authenticate if Rails.env.development? - # session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" + session[:wechat_open_id] = "o5fSc0607iR3rp4-h_VnuBTp8CiM" end unless session[:wechat_open_id].present? - redirect_to auth_trainings_path + redirect_to auth_trainings_path(return_url: CGI.escape(request.path)) end end - def find_training - if params[:id] == TAG_ID - @training = current_training - else - render_404 + def save_training + @training.assign_attributes(params) + @training.training_type = training_type + + if @training.training_type == 3 + @training.research_field = params[:research_field].select(&:present?).uniq.join(",") end + + @training.save! end - def current_training - Training.where(openid: session[:wechat_open_id], training_type: Training::Training_Type).first + def friendly_id + @friendly_id ||= params[:friendly_id].presence || params[:id] + end + + def training_type + @training_type ||= + case friendly_id + when 'aeee0601_2019' then 3 + when 'ceeaa06_2019' then 4 + end end - def valid_training - unless current_training - redirect_to training_path(id: TAG_ID) + def current_training + @_current_training ||= begin + Rails.logger.info("##########openid:#{session[:wechat_open_id]}, friendly_id: #{friendly_id}") + + return if training_type.blank? + + Training.where(openid: session[:wechat_open_id], training_type: training_type).first end end + def check_training_type + return if training_type.present? - private + render_404 + end + + def check_current_training + if current_training.blank? + if training_type.blank? + render_404 + return + end + + redirect_to enroll_training_path(id: friendly_id) + return + end + end def js_function_call begin @@ -321,14 +324,10 @@ class TrainingsController < ApplicationController end - def unifiedorder(out_trade_no, fee) + def unifiedorder(out_trade_no, fee, title) @config = {} - output = Wechat.pay.unifiedorder('湖南警察学院大数据培训会-报名费', - (fee * 100).to_i, - session[:wechat_open_id], - client_ip, - out_trade_no) + output = Wechat.pay.unifiedorder(title, (fee * 100).to_i, session[:wechat_open_id], client_ip, out_trade_no) data = output.fetch("xml") if data.nil? raise "获取微信统一单错误" @@ -356,5 +355,4 @@ class TrainingsController < ApplicationController @config end - end diff --git a/app/models/training.rb b/app/models/training.rb index 4c1f182e..58de07ab 100644 --- a/app/models/training.rb +++ b/app/models/training.rb @@ -3,7 +3,7 @@ class Training < ActiveRecord::Base attr_accessible :address, :email, :name, :phone, :position, :school, :sex, :openid, :training_type, :major, :student_id - # training_type 1 2018-培训会 2 警察学院大数据培训会 + # training_type 1 2018-培训会 2 警察学院大数据培训会 3 大数据和人工智能 4 工程教育认证 has_one :training_payinfo @@ -21,4 +21,26 @@ class Training < ActiveRecord::Base pay? && training_payinfo.payed? end + def research_field_include?(str) + research_field.present? && research_field.split(',').include?(str) + end + + def pay_order_title + case training_type + when 3 then '全国高校大数据和人工智能暑期师资培训会-报名费' + when 4 then '工程教育认证培训会-报名费' + end + end + + def registration_fee(num = 1) + case training_type + when 3 then + # 三人以上 8折 + num >= 3 ? 3000.0 * 0.8 * num : 3000.0 * num + when 4 then + 700.0 * num + else + raise ArgumentError + end + end end diff --git a/app/models/training_payinfo.rb b/app/models/training_payinfo.rb index 3520c4c0..9882c095 100644 --- a/app/models/training_payinfo.rb +++ b/app/models/training_payinfo.rb @@ -15,7 +15,12 @@ class TrainingPayinfo < ActiveRecord::Base PayType_bank = 3 #银行卡支付 def pay_type_str - pay_type==PayType_Wechat ? '微信支付' : (pay_type==PayType_alipay ? '支付宝支付' : (pay_type==PayType_bank ? '银行卡支付' : '')) + case pay_type + when PayType_Wechat then '微信支付' + when PayType_alipay then '支付宝支付' + when PayType_bank then '银行卡支付' + else '' + end end def pay_status_str @@ -30,13 +35,20 @@ class TrainingPayinfo < ActiveRecord::Base end def pay_time - WechatPay.where(:out_trade_no => self.out_trade_no).first.try(:created_at) + WechatPay.where(out_trade_no: out_trade_no).first.try(:created_at) end def wechat_wait_pay? pay_type.to_i == PayType_Wechat && status != Status_Payed end + def not_payed? + status.nil? || status == Status_None + end + + def offline_pay? + pay_type.to_i == PayType_bank + end def payed? status == Status_Payed diff --git a/app/models/user.rb b/app/models/user.rb index 52c4be8b..db1ff58a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1119,7 +1119,7 @@ class User < Principal end def member_of_course?(course) - courses.to_a.include?(course) + courses.to_a.include?(course) || User.current.business? end def member_of_contest?(contest) @@ -1323,7 +1323,7 @@ class User < Principal if Project === context return false unless context.allows_to?(action) # Admin users are authorized for anything else - return true if admin? + return true if admin? || business? # 课程:作品关联项目的老师也可以访问私有项目 course_ids = context.student_work_projects.blank? ? "(-1)" : "(" + context.student_work_projects.map{|swp| swp.course_id}.join(",") + ")" diff --git a/app/services/games_service.rb b/app/services/games_service.rb index f513316e..d732bb48 100644 --- a/app/services/games_service.rb +++ b/app/services/games_service.rb @@ -80,14 +80,14 @@ class GamesService if shixun.vnc begin shixun_tomcat = Redmine::Configuration['shixun_tomcat'] - service_host = Redmine::Configuration['tomcat_php'] + service_host = Redmine::Configuration['vnc_url'] uri = "#{shixun_tomcat}/bridge/vnc/getvnc" params = {tpiID: myshixun.id, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}"} res = uri_exec uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:99)") end - url = "#{service_host}" +":#{res['port']}/vnc_lite.html?password=headless" + url = "https://#{res['port']}.#{service_host}/vnc_lite.html?password=headless" Rails.logger.info("66666666sssssss#{url}") container = container.merge(:vnc_url => url) Rails.logger.info("777777666sssssss#{container}") diff --git a/app/tasks/statistic_school_daily_report_task.rb b/app/tasks/statistic_school_daily_report_task.rb index 5d0db197..c533c55c 100644 --- a/app/tasks/statistic_school_daily_report_task.rb +++ b/app/tasks/statistic_school_daily_report_task.rb @@ -25,13 +25,12 @@ class StatisticSchoolDailyReportTask .where(homework_type: 4, created_at: yesterday).count # 新增实训评测数量 - shixun_evaluate_count = Output.joins(game: :challenge) - .joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = challenges.shixun_id') + shixun_evaluate_count = EvaluateRecord.joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = evaluate_records.shixun_id') .joins('LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id AND hc.homework_type = 4') - .joins('LEFT JOIN members ON members.user_id = games.user_id') + .joins('LEFT JOIN members ON members.user_id = evaluate_records.user_id') .joins('LEFT JOIN courses ON members.course_id = courses.id AND hc.course_id = courses.id') .where(courses: { school_id: school.id }) - .where(created_at: yesterday).count + .where(created_at: yesterday).reorder(nil).count # 无有效数据时不记录 data = [teacher_count, student_count, course_count, shixun_count, active_user_count, diff --git a/app/views/account/_cooperative_partner_show.erb b/app/views/account/_cooperative_partner_show.erb index 67452b18..a358909c 100644 --- a/app/views/account/_cooperative_partner_show.erb +++ b/app/views/account/_cooperative_partner_show.erb @@ -1,8 +1,28 @@ <%= stylesheet_link_tag 'css/public','css/common'%>

合作伙伴

+
+

产学联盟

+ + +
+
-

企业合作

+

知名企业

-

高校合作

+

各类院校

diff --git a/app/views/exercise/_show_MCQ.html.erb b/app/views/exercise/_show_MCQ.html.erb index e1767b3b..57c36496 100644 --- a/app/views/exercise/_show_MCQ.html.erb +++ b/app/views/exercise/_show_MCQ.html.erb @@ -20,7 +20,11 @@ <% exercise_question.exercise_choices.reorder("choice_position").each_with_index do |exercise_choice,index| %>
  • - +
  • <% end %>
    diff --git a/app/views/layouts/base_trainings.html.erb b/app/views/layouts/base_trainings.html.erb index 4f7f4774..51115cb1 100644 --- a/app/views/layouts/base_trainings.html.erb +++ b/app/views/layouts/base_trainings.html.erb @@ -2,13 +2,16 @@ - <%= if params[:controller] == "trainings" && params[:action] == "enroll" - "报名" - elsif params[:controller] == "trainings" && params[:action] == "pay" - "费用支付" - elsif params[:controller] == "trainings" && params[:action] == "result" - "支付状态" - end %> + + <%= + case "#{params[:controller]}-#{params[:action]}" + when 'trainings-show' then '报名信息' + when 'trainings-enroll' then '报名' + when 'trainings-pay' then '费用支付和发票信息' + when 'trainings-result' then '支付信息' + end + %> + diff --git a/app/views/managements/_subject_level_list.html.erb b/app/views/managements/_subject_level_list.html.erb index 1a4bf6d7..0988bd6e 100644 --- a/app/views/managements/_subject_level_list.html.erb +++ b/app/views/managements/_subject_level_list.html.erb @@ -1,3 +1,6 @@ +
    + " class="fr task-btn task-btn-orange ml5" >导出excel +
    diff --git a/app/views/managements/graduation_standard.html.erb b/app/views/managements/graduation_standard.html.erb index c61e6bff..a667c7c2 100644 --- a/app/views/managements/graduation_standard.html.erb +++ b/app/views/managements/graduation_standard.html.erb @@ -1,16 +1,18 @@

    毕业要求通用标准<%= @standards.count %>

    -

    + 新增

    -
    -

    - *1 - -

    -

    - 取消 - 保存 -

    -
    + <% if User.current.admin? %> +

    + 新增

    +
    +

    + *1 + +

    +

    + 取消 + 保存 +

    +
    + <% end %>
    等级
    diff --git a/app/views/managements/training_2018.html.erb b/app/views/managements/training_2018.html.erb index ddce89ac..8ddea516 100644 --- a/app/views/managements/training_2018.html.erb +++ b/app/views/managements/training_2018.html.erb @@ -5,6 +5,8 @@ + + - + <% unless disabled %> +
    + +
    + <% end %> \ No newline at end of file diff --git a/app/views/trainings/enroll.html.erb b/app/views/trainings/enroll.html.erb index c84a314c..f5ee6867 100644 --- a/app/views/trainings/enroll.html.erb +++ b/app/views/trainings/enroll.html.erb @@ -1,18 +1,19 @@ -
    -

    湖南警察学院大数据培训缴费

    - <%= form_for @training do |f| %> -

    基本信息

    -
  • - 姓名 - -
  • -
  • - 性别 - - - -
  • +<% if false %> +
    +

    湖南警察学院大数据培训缴费

    + <%= form_for @training do |f| %> +

    基本信息

    +
  • + 姓名 + +
  • +
  • + 性别 + + + +
  • 专业
  • - - - +
  • + 手机号码 + +
  • + +

    + 下一步 + <% end %> +
    + +
    +
  • +
  • +
    + +<% end %> +
    +

    <%= @training_type == 3 ? '信息技术新工科产学研联盟师资培训班' : '工程教育认证' %>

    + <%= form_for @training do |f| %> + <%= hidden_field_tag(:friendly_id, @friendly_id) %> + +

    基本信息

    +
  • + 姓名 + +
  • +
  • + 性别 + + + +
  • +
  • + 单位 + +
  • +
  • + 职称 + +
  • 手机号码
  • - + + <% if @training_type == 3 %> +

    您关注的课程类型(最少选1项)

    + + <% %w(程序设计 操作系统 数据库 软件工程 云计算 大数据 人工智能 计算机网络 物联网 信息安全 其他).each_with_index do |name, index| %> +
  • + <%= name %> + + id="check_<%= index %>" class="magic-checkbox"> + + +
  • + <% end %> + <% end %> + + + + + + + + + + + + + +

    - 下一步 + <%= @training.new_record? ? '我要报名' : '保存' %> <% end %>
    @@ -79,42 +205,49 @@ $(down).find("#sexl").html($(this).html()); hideNav(downNav); - if ($(this).html()=='男'){ + if ($(this).html() == '男') { $('#sex').val("1"); - } else { + } else { $('#sex').val("2"); } - }) + }); }) //下一步 function NextStep() { - var username = $("#username").val(); - var userMajor = $("#userMajor").val(); - var userphone = $("#userphone").val(); - var userID = $("#userID").val(); - - if (username == '') { - alert("请输入真实姓名"); - return; - } - if (userMajor == '') { - alert("请输入专业"); - return; - } + var username = $("#username").val(); + var userUnit = $("#userUnit").val(); + var userPositional = $("#userPositional").val(); + var userphone = $("#userphone").val(); - if (userID == '') { - alert("请输入学号"); - return; - } + if (username == '') { + alert("请输入姓名"); + return; + } + if (userUnit == '') { + alert("请输入单位名称或者学校"); + return; + } + + if (userPositional == '') { + alert("请输入职称"); + return; + } + + if (userphone == '') { + alert("请输入手机号码"); + return; + } else if (!/^1\d{10}$/.test(userphone) && !/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(userphone)) { + alert("请输入正确的手机号码"); + return; + } - if (userphone == '') { - alert("请输入手机号码"); - return; - } else if (!/^1\d{10}$/.test(userphone) && !/^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(userphone)) { - alert("请输入正确的手机号码"); - return; + <% if @training_type == 3 %> + if ($("input[type='checkbox'][name='research_field[]']:checked").length == 0) { + alert('请选择您关注的课程类型'); + return; } + <% end %> $('form').submit(); diff --git a/app/views/trainings/pay.html.erb b/app/views/trainings/pay.html.erb index 87b720ca..9aebe19f 100644 --- a/app/views/trainings/pay.html.erb +++ b/app/views/trainings/pay.html.erb @@ -1,6 +1,8 @@
    -
    + <%= hidden_field_tag(:friendly_id, @friendly_id) %> + +
    >

    <%= @training.training_payinfo.pay_type.to_i == 3 ? "线下支付" : "微信支付" %> @@ -15,89 +17,118 @@

  • -

    800190320609016

    +

    1901008009200085901

  • -

    湖南酷得网络科技有限公司

    +

    长沙智擎信息技术有限公司

  • -

    长沙银行股份有限公司四方支行

    +

    工商银行长沙市岳麓山支行

  • -

    完成线下支付后,请将支付截图粘贴到备注中,以便财务审核

    +

    完成银行转账后,请上传转账凭证,由会务组审核

    - + + + + +

    + 发票抬头 + +

    +

    + 税务登记号 +

    发票内容 + value="<%= @training.training_payinfo.try(:invoice_content).presence || '会议注册费' %>"/>

    -
    --> +

    备注

    - + +
    +
    "> +

    上传转账凭证

    <%= render :partial => 'upload_img', :locals => {:training => @training} %>
    +
    -

    费用明细

    -

    大数据培训缴费

    -
    -

    - - <%= @training.training_payinfo.num %> - - - <%= @pay_fee * @training.training_payinfo.num %> - - -

    -
    +

    费用明细 + <% if @training.training_type == 3 %> + (3人及以上8折优惠) + <% end %> +

    +

    含会务费、培训费、教材资料费、餐费、专家差旅费等

    +

    + + + <%= @training.training_payinfo.fee || @training.registration_fee %> + + + <% if @training.training_payinfo.not_payed? %> + + + + <%= @training.training_payinfo.num || 1 %> + + + + <% else %> + <%= @training.training_payinfo.num || 1 %> + <% end %> + +

    -
    " id="offlinePaySubmitBtn"> - 返回 - 提交 +
    " id="offlinePaySubmitBtn"> + 返回 + <%= @training.training_payinfo.new_record? ? '完成转账' : '提交' %>
    -
    " id="paySubmitBtn"> - 返回 - 立即支付 +
    " id="paySubmitBtn"> + 返回 + <% if @training.training_payinfo.not_payed? %> + 立即支付 + <% else %> + 提交 + <% end %>
    - + + + + + + + + + + + + + + + + + + + + +
    @@ -111,7 +142,7 @@
    - + @@ -120,57 +151,57 @@ // // eruda.init(); - // var userInfo = { - // name: '<%= @training.name %>', - // school: '<%= @training.school %>', - // //支付方式,默认为0 - // // 1 微信支付 - // // 2 支付宝支付 - // // 3 银行卡支付 - // payType: <%#= @training.training_payinfo.pay_type.to_i %>, - // - // //发票抬头 - // //为空则代表不需要发票 - // invoiceTitle: '<%#= @training.training_payinfo.invoice_title %>', - // - // //税号 - // invoiceNo: '<%#= @training.training_payinfo.invoice_no %>' - // }; + var userInfo = { + name: '<%= @training.name %>', + school: '<%= @training.school %>', + //支付方式,默认为0 + // 1 微信支付 + // 2 支付宝支付 + // 3 银行卡支付 + // payType: <%#= @training.training_payinfo.pay_type.to_i %>, + newPayinfo: <%= @training.training_payinfo.new_record? %>, + payType: 3, + //发票抬头 + //为空则代表不需要发票 + invoiceTitle: '<%= @training.training_payinfo.invoice_title || @training.school %>', + //税号 + invoiceNo: '<%= @training.training_payinfo.invoice_no %>' + }; //点击弹出发票弹框 - //aboutBillType(userInfo); + // aboutBillType(userInfo); //点击弹出支付方式弹框 aboutPayType(); //初始化发票类型 - /*InitBill(userInfo);*/ + // InitBill(userInfo); //切换发票类型 - /*$(".billType li").on("click", function () { - $(".billType li").removeClass("active"); - $(this).addClass("active"); - billTypeShowFun(parseInt($(this).index()),userInfo); - })*/ - //关闭弹窗 - $(".billClose").on("click", function () { - hideNav($(".downNav")); - }); + // $(".billType li").on("click", function () { + // $(".billType li").removeClass("active"); + // $(this).addClass("active"); + // billTypeShowFun(parseInt($(this).index()), userInfo); + // }) + // //关闭弹窗 + // $(".billClose").on("click", function () { + // hideNav($(".downNav")); + // }); //延迟支付,直接提交 $('#delayPayBtn').on('click', function () { - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); - } + if(!checkBillInfo()){ return } + alert("报名成功,请尽快支付"); $('form').submit(); }); + $(".billInput").on("blur",function(){ + document.body && (document.body.scrollTop = document.body.scrollTop); + }) //立即支付 $('#payBtn').on('click', function () { + if(!checkBillInfo()){ return } - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); - } var postData = $('form').serialize(); postData += '&js=true' console.log(postData); @@ -201,7 +232,7 @@ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 setTimeout(function () { - window.location.href = "/trainings/bigdata_hnjcxy_2019/result"; + window.location.href = "/trainings/<%= @friendly_id %>/result"; }, 500); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') { @@ -219,80 +250,109 @@ //线下支付提交 $('#submitFormBtn').on('click', function () { - if($("#billDemand").attr("status")==2){ - $(".billInput").val(''); + if(!checkBillInfo()){ return; } + + <% if @training.training_payinfo.blank? || (@training.training_payinfo.not_payed? && @training.training_payinfo.attachment.blank?) %> + var image = $("input[name='image']").val() + if (!image || image.length < 0) { + alert('请先上传支付凭证'); + return; } - $('form').submit(); + <% end %> + $('form').submit(); }); + + // 微信支付后修改内容提交 + $("#submitWxpayFormBtn").on('click', function () { + if(!checkBillInfo()){ return; } + $('form').submit(); + }); + //上传头像 InitPhoto(); - //加减报名人数 - $(".minusNum").click(function(){ - var num=parseInt($("#enlistNum").html()); - var money=parseFloat($("#enlistMoney").html()).toFixed(2); - if(num>1){ - money=parseFloat(parseFloat(money)-parseFloat(money)/parseFloat(num)).toFixed(2); - num=num-1; - $("#enlistNum").html(num); - $("#enlistMoney").html(money); - if(num==1){ - $(".icon-default").removeClass("blue").addClass("sky_blue"); - } - $("input[name='enlistN']").val(num); + }) + + //加减报名人数 + function minusNum(item){ + var num=parseInt($("#enlistN").html()); + var money=parseFloat(<%= @training.registration_fee %>).toFixed(2); + var percent=$("#percentPay"); + if(num>1){ + num=num-1; + if(num == 1){ + $(".icon-default").removeClass("blue").addClass("sky_blue"); } - }) - $(".plusNum").click(function(){ - var num=parseInt($("#enlistNum").html()); - if(num==1){ - $(".icon-default").removeClass("sky_blue").addClass("blue"); + money=parseFloat(parseFloat(money) *num).toFixed(2); + if($(percent).length>0 && num>2){ + $(".lastPrice").html("¥"+ money); + money = parseFloat(parseFloat(money) *0.8); + }else{ + $(".lastPrice").html(""); } - var money=parseFloat($("#enlistMoney").html()).toFixed(2); - money=parseFloat(parseFloat(money)+parseFloat(money)/parseFloat(num)).toFixed(2); - num=num+1; + $("#enlistN").html(num); + $("#enlistM").html(money); + $("#enlistNum").val(num); + $("#enlistMoney").val(money); + $("input[name='enlistNum']").val(num); + } + } + function plusNum(item){ + var num=parseInt($("#enlistN").html()); + var money=parseFloat(<%= @training.registration_fee %>).toFixed(2); + var percent=$("#percentPay"); + + num=num+1; + if(num > 1){ + $(".icon-default").removeClass("sky_blue").addClass("blue"); + } + money=parseFloat(parseFloat(money) *num).toFixed(2); - $("#enlistNum").html(num); - $("#enlistMoney").html(money); - $("input[name='enlistN']").val(num); - }) - }) + if($(percent).length>0 && num>2){ + $(".lastPrice").html("¥"+ money); + money = parseFloat(parseFloat(money) * 0.8).toFixed(2); + }else{ + $(".lastPrice").html(""); + } + + $("#enlistN").html(num); + $("#enlistM").html(money); + $("#enlistNum").val(num); + $("#enlistMoney").val(money); + $("input[name='enlistNum']").val(num); + } //页面加载时,初始化发票类型 - /*function InitBill(userInfo){ - var index=2; - $("#billDemand").html("不需要").attr("status",2); - if(userInfo.invoiceTitle != "" && userInfo.invoiceNo != ""){ + function InitBill(userInfo){ + var index=1; + $("#billDemand").html("单位").attr("status",1); + if (!userInfo.newPayinfo) { + if(userInfo.invoiceTitle != "" && userInfo.invoiceNo == ""){ index=0; - $("#billDemand").html("单位").attr("status",0); - } - if(userInfo.invoiceTitle != "" && userInfo.invoiceNo == ""){ - index=1; - $("#billDemand").html("个人").attr("status",1); + $("#billDemand").html("个人").attr("status",0); + } } $(".billType li").removeClass("active"); $(".billType li").eq(index).addClass("active"); billTypeShowFun(index,userInfo); - }*/ - function billTypeShowFun(index,userInfo){ - if (parseInt(index) == 0) { + } + function billTypeShowFun(index, userInfo){ + if (parseInt(index) == 1) { $(".needWrite").removeClass("none"); - $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.school); - $(".taxNumber").removeClass("none"); - } else if (parseInt(index) == 1) { + $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.invoiceTitle || userInfo.school); + $(".taxNumber").removeClass("none").val(userInfo.invoiceNo); + } else if (parseInt(index) == 0) { $(".needWrite").removeClass("none"); $(".billUnit").attr("placeholder", "请填写姓名").val(userInfo.name); - $(".taxNumber").addClass("none"); - } else { - $(".needWrite").addClass("none"); - $(".billInput").val(''); + $(".taxNumber").val('').addClass("none"); } } //点击弹出发票类型弹框 - /*function aboutBillType(userInfo){ + function aboutBillType(userInfo){ var bill = $("#billLine"); var billNav = $(".billDownNav"); showNav(bill, billNav, "down"); - }*/ + } //点击弹出支付方式弹框 function aboutPayType() { @@ -308,14 +368,14 @@ $("#payTypeName").html($(this).html().trim()); console.log($(this).index()); if ($(this).index() == 0) { //微信支付 - $("#payInfos,#sendPhoto").addClass("none"); + $("#payInfos,.pay-image").addClass("none"); //切换显示按钮 $("#offlinePaySubmitBtn").addClass("none"); $("#paySubmitBtn").removeClass("none"); $('#pay_type').val("1"); } else { //线下支付 - $("#payInfos,#sendPhoto").removeClass("none"); + $("#payInfos,.pay-image").removeClass("none"); //切换显示按钮 $("#offlinePaySubmitBtn").removeClass("none"); $("#paySubmitBtn").addClass("none"); @@ -328,40 +388,59 @@ //提交发票信息 - /*function submitBillInfo() { + function submitBillInfo() { var type = $(".billType li.active").html(); var unit = $(".billUnit").val(); var tax = $(".taxNumber").val(); //只有选择了单位时才需要判断三个是否都已经填写 + if (type == "单位" || type == "个人") { + if (unit == "") { + $(".billUnit").addClass("nullVal"); + return; + } else { + $(".billUnit").removeClass("nullVal"); + } + } if (type == "单位") { - if (unit == "") { - $(".billUnit").addClass("nullVal"); - return; - } else { - $(".billUnit").removeClass("nullVal"); - } - if (tax == "") { - $(".taxNumber").addClass("nullVal"); - return; - } else { - $(".taxNumber").removeClass("nullVal"); - } + if (tax == "") { + $(".taxNumber").addClass("nullVal"); + return; + } else { + $(".taxNumber").removeClass("nullVal"); + } } //选择单位或者个人都要判断是否填写了发票内容 - if (type == "单位" || type == "个人") { - var remark = $("input[name='invoice_content']").val(); - if (remark == "") { - $("input[name='invoice_content']").addClass("nullVal"); - return; - } else { - $("input[name='invoice_content']").removeClass("nullVal"); - } - } + // if (type == "单位" || type == "个人") { + // var remark = $("input[name='invoice_content']").val(); + // if (remark == "") { + // $("input[name='invoice_content']").addClass("nullVal"); + // return; + // } else { + // $("input[name='invoice_content']").removeClass("nullVal"); + // } + // } $("#billDemand").html(type); //记录选中的发票类型 $("#billDemand").attr("status",$(".billType li.active").index()); hideNav($(".billDownNav")); - }*/ + } + + function checkBillInfo() { + if ($("input[name='invoice_title']").val() == '') { + alert("请填写发票抬头"); + return false; + } + if ($("input[name='invoice_no']").val() == '') { + alert("请填写税务登记号"); + return false; + } + if ($("input[name='invoice_content']").val() == '') { + alert("请填写发票内容"); + return false; + } + + return true; + } function InitPhoto() { var tmpl = '
  • ', diff --git a/app/views/trainings/result.html.erb b/app/views/trainings/result.html.erb index 31e845f8..c71758ab 100644 --- a/app/views/trainings/result.html.erb +++ b/app/views/trainings/result.html.erb @@ -10,12 +10,12 @@ <%= @training.sex == 1 ? '男' : '女' %>

    - - <%= @training.major %> + + <%= @training.school %>

    - - <%= @training.student_id %> + + <%= @training.position %>

    @@ -29,6 +29,14 @@

    -->
    +

    + + <%= @training.training_payinfo.num %>人 +

    +

    + + ¥<%= @training.training_payinfo.fee %> +

    <%= @training.training_payinfo.pay_status_str %> @@ -55,56 +63,51 @@ <% end %> <% end %> - + <% end %> +

    -

    -

    <%= @training.training_payinfo.info %>

    + <% if @training.training_payinfo.info.present? %> +

    +

    <%= @training.training_payinfo.info %>

    + <% end %> <% if @training.training_payinfo.attachment_id.to_i > 0 || @training.training_payinfo.pay_type != TrainingPayinfo::PayType_Wechat %> +

    - <%= render :partial => 'upload_img', :locals => {:training => @training} %> + <%= render partial: 'upload_img', locals: { training: @training, disabled: true } %> + <% end %> +
    +
    +
    + +
    + <% if @training.training_payinfo.wechat_wait_pay? %> + <%= link_to "返回", training_path(id: @friendly_id, disable_redirect: true), class: 'leftbtn' %> + 立即支付 + <% else%> + <%= link_to "返回", pay_training_path(id: @friendly_id, disable_redirect: true), class: 'rightbtn', style: 'width: 100%' %> <% end %> -

    ¥<%= @training.training_payinfo.fee %><%= @training.training_payinfo.num %>人

    - - - <% if @training.payed? %> - 完成 - <% else %> - <% if @training.training_payinfo.wechat_wait_pay? %> -
    - <%= link_to "返回", pay_training_path(id: 'bigdata_hnjcxy_2019'), class: 'leftbtn' %> - 立即支付 -
    - <% elsif !@training.payed? %> - <%= link_to "返回", pay_training_path(id: 'bigdata_hnjcxy_2019'), class: 'returnBtn' %> - <% end %> - <% end %> @@ -118,7 +121,7 @@ // eruda.init(); function wechatPay() { $.ajax({ - url: '<%= pay_js_trainings_path %>', + url: '<%= pay_js_trainings_path(friendly_id: @friendly_id) %>', type: "POST", data: '{}' } @@ -144,7 +147,7 @@ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 setTimeout(function () { - window.location.href = "/trainings/bigdata_hnjcxy_2019/result"; + window.location.href = "/trainings/<% @friendly_id %>/result"; }, 500); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') { @@ -186,6 +189,7 @@ var data = new FormData(); data.append('image', files[0]); + data.append('friendly_id', '<%= @friendly_id %>'); $.ajax({ url: '<%= update_picture_trainings_path %>', diff --git a/app/views/trainings/trainingsInfo.html.erb b/app/views/trainings/trainingsInfo.html.erb new file mode 100644 index 00000000..964455bc --- /dev/null +++ b/app/views/trainings/trainingsInfo.html.erb @@ -0,0 +1,51 @@ +
    +
    +

    报名成功

    +
    +
    +
    +

    基本信息

    +
  • + 姓名 + <%= @training.name %> +
  • +
  • + 性别 + <%= @training.sex == 1 ? '男' : '女' %> +
  • +
  • + 单位 + <%= @training.school %> +
  • +
  • + 职称 + <%= @training.position %> +
  • +
  • + 手机号 + <%= @training.phone %> +
  • +
    + +<% if @training.training_type == 3 %> +
    +

    您关注的课程类型

    + <% @training.research_field.to_s.split(',').each do |name| %> + <%= name %> + <% end %> +
    +<% end %> + +<%= link_to('修改资料', enroll_training_path(id: @friendly_id, disable_redirect: true), class: 'info_updateBtn') %> + +<% if @training.training_payinfo.blank? || @training.training_payinfo.not_payed? %> +
    + <%= link_to '转账支付', pay_training_path(id: @friendly_id, pay_type: 3), class: 'leftbtn' %> + <%= link_to '微信支付', pay_training_path(id: @friendly_id, pay_type: 1), class: 'rightbtn' %> +
    +<% else %> +
    + <%= link_to '支付详情', pay_training_path(id: @friendly_id, pay_type: @training.training_payinfo.pay_type), + class: 'rightbtn', style: 'width: 100%;' %> +
    +<% end %> \ No newline at end of file diff --git a/app/views/users/_l_course.html.erb b/app/views/users/_l_course.html.erb index 1a16703f..b7dcf029 100644 --- a/app/views/users/_l_course.html.erb +++ b/app/views/users/_l_course.html.erb @@ -46,7 +46,7 @@ <%#= render :partial => "users/course_item", :locals => {:objects => @objects} %> <% @objects.each do |object| %> - <% allow_visit = @show_all || object.is_public == 1 || User.current.member_of_course?(object) %> + <% allow_visit = @show_all || object.is_public == 1 || User.current.member_of_course?(object) || User.current.business? %>
    <% if object.is_public == 1 %>
    diff --git a/db/migrate/20190613013623_add_reseach_field_to_trainings.rb b/db/migrate/20190613013623_add_reseach_field_to_trainings.rb new file mode 100644 index 00000000..5354d13a --- /dev/null +++ b/db/migrate/20190613013623_add_reseach_field_to_trainings.rb @@ -0,0 +1,5 @@ +class AddReseachFieldToTrainings < ActiveRecord::Migration + def change + add_column :trainings, :research_field, :string + end +end diff --git a/db/migrate/20190613043232_modify_input_for_test_sets.rb b/db/migrate/20190613043232_modify_input_for_test_sets.rb new file mode 100644 index 00000000..14d71acc --- /dev/null +++ b/db/migrate/20190613043232_modify_input_for_test_sets.rb @@ -0,0 +1,8 @@ +class ModifyInputForTestSets < ActiveRecord::Migration + def up + change_column :test_sets, :input, :text + end + + def down + end +end diff --git a/db/migrate/20190613063745_add_training_category_to_trainings.rb b/db/migrate/20190613063745_add_training_category_to_trainings.rb new file mode 100644 index 00000000..f304a27d --- /dev/null +++ b/db/migrate/20190613063745_add_training_category_to_trainings.rb @@ -0,0 +1,5 @@ +class AddTrainingCategoryToTrainings < ActiveRecord::Migration + def change + add_column :trainings, :training_category, :string + end +end diff --git a/db/migrate/20190613133734_remove_training_category_in_trainings.rb b/db/migrate/20190613133734_remove_training_category_in_trainings.rb new file mode 100644 index 00000000..aec80089 --- /dev/null +++ b/db/migrate/20190613133734_remove_training_category_in_trainings.rb @@ -0,0 +1,9 @@ +class RemoveTrainingCategoryInTrainings < ActiveRecord::Migration + def up + remove_column :trainings, :training_category + end + + def down + add_column :trainings, :training_category, :string + end +end diff --git a/lib/tasks/statistic_school_daily_report.rake b/lib/tasks/statistic_school_daily_report.rake index 1dbb591e..2d487ff6 100644 --- a/lib/tasks/statistic_school_daily_report.rake +++ b/lib/tasks/statistic_school_daily_report.rake @@ -70,55 +70,106 @@ namespace :school_daily_report do end end - desc 'statistic old shixun homework count and shixun evaluate count' - task :statistic_shixun_info_count, [:date] => :environment do |_, args| + # 统计学校历史每天实训作业新增数 + desc 'statistic school shixun homework count everyday' + task :statistic_shixun_homework_count, [:date] => :environment do |_, args| date = Time.zone.parse(args[:date]).beginning_of_day current_date = (Time.zone.now - 5.hour).beginning_of_day custom_logger("statistic range: #{date}..#{current_date}") while current_date > date date_str = date.strftime('%Y-%m-%d') - # 检查当天数据是否已经统计 - school_count = School.count - query_times = school_count % query_size == 0 ? school_count / query_size : (school_count / query_size) + 1 + custom_logger("Start statistic => Date: #{date_str} ~") - custom_logger("Start statistic => Date: #{date_str}, school count: #{school_count}, insert times: #{query_times} ~") - query_times.times do |index| - sql = school_daily_report_sql(date, query_size, index * query_size) - reports = School.find_by_sql(sql) + begin_date = (date + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + end_date = (date + 1.day + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + + homework_count_map = HomeworkCommon.joins('LEFT JOIN courses cs ON homework_commons.course_id = cs.id') + .where('cs.school_id IS NOT NULL') + .where(homework_type: 4, created_at: begin_date...end_date).reorder(nil) + .group('cs.school_id').count + + ActiveRecord::Base.transaction do + exist_school_ids = SchoolDailyReport.where(date: date_str).pluck(:school_id) - if SchoolDailyReport.exists?(date: date) - data = [] - reports.each do |report| - next if %w(teacher_count student_count course_count shixun_count shixun_homework_count shixun_evaluate_count active_user_count).all? { |key| report[key].zero? } - - record = SchoolDailyReport.where(school_id: report['id'], date: date_str).first - - if record.present? - record.update_attributes(shixun_homework_count: report['shixun_homework_count'], shixun_evaluate_count: report['shixun_evaluate_count']) - else - data << [ - report['id'], report['name'], report['teacher_count'], report['student_count'], report['course_count'], - report['shixun_count'], report['shixun_homework_count'], report['shixun_evaluate_count'], - report['active_user_count'], date_str, current_datetime, current_datetime - ] - end + updated_school_ids = homework_count_map.keys & exist_school_ids # 需要更新的 + + updated_reports = [] + created_reports = [] + homework_count_map.each do |school_id, homework_count| + if updated_school_ids.include?(school_id) + updated_reports << "WHEN #{school_id} THEN #{homework_count}" + else + created_reports << "(#{school_id}, '#{date_str}', #{homework_count})" end - else - data = reports.map do |report| - # 无效数据不记录 - next if %w(teacher_count student_count course_count shixun_count shixun_homework_count shixun_evaluate_count active_user_count).all? { |key| report[key].zero? } - - [ - report['id'], report['name'], report['teacher_count'], report['student_count'], report['course_count'], - report['shixun_count'], report['shixun_homework_count'], report['shixun_evaluate_count'], - report['active_user_count'], date_str, current_datetime, current_datetime - ] - end.compact - batch_create_school_daily_reports!(data) if data.present? + end + + if updated_reports.present? + # 这样更新快些 + SchoolDailyReport.connection.execute("UPDATE school_daily_reports SET shixun_homework_count = CASE school_id #{updated_reports.join(' ')} END "\ + "WHERE school_id IN (#{updated_school_ids.join(',')}) AND date = '#{date_str}'") + end + + if created_reports.present? + SchoolDailyReport.connection.execute("INSERT INTO school_daily_reports(school_id, date, shixun_homework_count) VALUES#{created_reports.join(',')}") end end + + custom_logger("Statistic complete! date: #{date_str}") + + date += 1.day + end + end + + # 统计学校历史每天实训评测新增数 + desc 'statistic school shixun evaluate count everyday' + task :statistic_shixun_evaluate_count, [:date] => :environment do |_, args| + date = Time.zone.parse(args[:date]).beginning_of_day + current_date = (Time.zone.now - 5.hour).beginning_of_day + custom_logger("statistic range: #{date}..#{current_date}") + + while current_date > date + date_str = date.strftime('%Y-%m-%d') + + custom_logger("Start statistic => Date: #{date_str} ~") + + begin_date = (date + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + end_date = (date + 1.day + 5.hour).strftime('%Y-%m-%d %H:%M:%S') + + evaluate_count_map = EvaluateRecord.joins('LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = evaluate_records.shixun_id') + .joins('LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id AND hc.homework_type = 4') + .joins('LEFT JOIN members ON members.user_id = evaluate_records.user_id') + .joins('LEFT JOIN courses ON members.course_id = courses.id AND hc.course_id = courses.id') + .where(created_at: begin_date...end_date).where('courses.school_id IS NOT NULL') + .reorder(nil).group('courses.school_id').count + + ActiveRecord::Base.transaction do + exist_school_ids = SchoolDailyReport.where(date: date_str).pluck(:school_id) + + updated_school_ids = evaluate_count_map.keys & exist_school_ids # 需要更新的 + + updated_reports = [] + created_reports = [] + evaluate_count_map.each do |school_id, evaluate_count| + if updated_school_ids.include?(school_id) + updated_reports << "WHEN #{school_id} THEN #{evaluate_count}" + else + created_reports << "(#{school_id}, '#{date_str}', #{evaluate_count})" + end + end + + if updated_reports.present? + # 这样更新快些 + SchoolDailyReport.connection.execute("UPDATE school_daily_reports SET shixun_evaluate_count = CASE school_id #{updated_reports.join(' ')} END "\ + "WHERE school_id IN (#{updated_school_ids.join(',')}) AND date = '#{date_str}'") + end + + if created_reports.present? + SchoolDailyReport.connection.execute("INSERT INTO school_daily_reports(school_id, date, shixun_evaluate_count) VALUES#{created_reports.join(',')}") + end + end + custom_logger("Statistic complete! date: #{date_str}") date += 1.day @@ -181,14 +232,12 @@ namespace :school_daily_report do LEFT JOIN courses cs ON hc.course_id = cs.id WHERE cs.school_id = schools.id AND hc.homework_type = 4 AND hc.created_at BETWEEN "#{begin_date}" AND "#{end_date}" ) shixun_homework_count, ( - SELECT COUNT(*) FROM outputs os - LEFT JOIN games gs ON os.game_id = gs.id - LEFT JOIN members ON members.user_id = gs.user_id - LEFT JOIN challenges cls ON gs.challenge_id = cls.id - LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = cls.shixun_id + SELECT COUNT(*) FROM evaluate_records er + LEFT JOIN members ON members.user_id = er.user_id + LEFT JOIN homework_commons_shixuns hcs ON hcs.shixun_id = er.shixun_id LEFT JOIN homework_commons hc ON hcs.homework_common_id = hc.id LEFT JOIN courses ON hc.course_id = courses.id AND members.course_id = courses.id - WHERE courses.school_id = schools.id AND os.created_at BETWEEN "#{begin_date}" AND "#{end_date}" + WHERE courses.school_id = schools.id AND er.created_at BETWEEN "#{begin_date}" AND "#{end_date}" ) shixun_evaluate_count, ( SELECT COUNT(*) FROM users u LEFT JOIN user_extensions ue ON ue.user_id = u.id diff --git a/public/MP_verify_FL7DKThNNDDEnU4k.txt b/public/MP_verify_FL7DKThNNDDEnU4k.txt new file mode 100644 index 00000000..5f5ee70d --- /dev/null +++ b/public/MP_verify_FL7DKThNNDDEnU4k.txt @@ -0,0 +1 @@ +FL7DKThNNDDEnU4k \ No newline at end of file diff --git a/public/assets/iconfont/iconfont.css b/public/assets/iconfont/iconfont.css index f4db5e84..058c2e74 100644 --- a/public/assets/iconfont/iconfont.css +++ b/public/assets/iconfont/iconfont.css @@ -1,10 +1,10 @@ @font-face {font-family: "iconfont"; - src: url('iconfont.eot?t=1559184647273'); /* IE9 */ - src: url('iconfont.eot?t=1559184647273#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAGOgAAsAAAAAsqAAAGNOAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCXJAqCrUCB7BYBNgIkA4UwC4JaAAQgBYRtB49sG9SPJXLTabkdAKlI76miKIuzMjIQbByI4Vmx7P+/JqhxWM+ugtkYOBwWYVlWAocVcqiBSJu2RBRuW1igJt0DCRI29jKoKSf+9TSkpvfyc7vQATs8SHykPH3OlhifOPalKB6zG86/1H3ivH75K2Jla3U/NXnR6CQi9pN3X5JPAFREpTrVLK/AQnV4fm69//8yiVxQAsJgVGxsRI8aKYxKh8CIGqCUBRZhoQ0WKiagMxruUO+MUxT0xEashKhatbrNudeuOnV8wjy/Ik6B0GiEItBYAovDeITCIfynUM/n6f99nV8SDlMkG5JdSqaWLlspU0IgYVrPvOHH+pXP/ulKlOSRAiaQ93rKq2XadmPO7t/uYlP/3wg2oWMdLjm9W9tH/9/Xve4Cy0bESMS2GiAAfL8xrW6fHwtDrNmNk7sBCz1WBYdCDzwLN0fwk5Rw82PTvj/LEBjySICUhf2ldyG/cFe6bO6cOyvuKKe52/Kq/e3MCAIHgkDLh/zsy7J9gKjP6mt9tZLt5NjmQ0pS5qE6+75799a968JgoWS0gE9QsAC/2H1NrlXVGCjtYODoUZkpfJz+/z/dirThXZeElSzm+mcGWHG50JKuOe28FQd2hl1182a9qII5qnfcdSIMQgTMv6rpCqjYkqvkVsWnp9S6uq1pex0zjP9/gBQ+PiERhCQTgJgTyCsE4QKQpzMhyUUnO9Zd7r3oUmqb7EwAyTsDkvwCUFfIO8ePvEvTpUkudUqpU+lje3uWIfMQb74ty7wHC3YkCQ7A0pMXD9DSIaoI6p1rCchrsuvXcL08OGmdKGUWLlkk8kWtx9j8N1bhkrWPKSJxHIjo7zzGZov6TCMKVOII3fZNAajJSG/F5KmzF6sORe+tABS7d2zboLonQUV6C7ghDLNspVpxXxW40o3SGHDP/PSLP+yLCVCCLtP7NX/rlM3G573x/1eryw2uzSdjtRxQBvRGBSjfZ7Olm8oW9zaEwN3fKqW1GKu9CjijGfQMdgY/Q57pnOmd2TSzf2Zo5trMvZkHM7Mz72e+PUc/N3xu/lz0PPx5+vPM56ufr3n+/fmfV8tf094Uvr87Pw+8gbH9xBnaTM9VP0J3Xu737aWNAfACAUV/CBQGya56NC3viPv/Bi8rB/oaoL/hPjdQJ019YqJRZqgnyCxtzTbHXPMsNN9iSyy1zHILLLLCSmusslpdydZZb4ONNtlsi6222W6HPfbaaZ/9mttltzYOOOiQSY477KQjTjvqmBMuOOWMs8656JLLrrjqmutuuKm7W+6656E7bmvvvgceeeypZ5576ZXX3minum1aek8ddDWtV2CZYLRmeinxNNY449XXVSOfqsHZNNP11sMgI4w0xGemqEZXR53100dt5qra5R1dlLG97byhJhusg1osfayhVlr7wFumeqECbbf3KarC5NoA1Rurlfc5ARX6EggDCIz+BMFwgrrjQgMDCRadCB5NCRGfEBImEjJGERpmEDrqAWFgJmFiFmGhLWFjNtHCHKKNuUQH84guFhI9zCf6WEwMsIQYYikxwjJijOWEgwWEi0WEhxWEj5XEBGuIKVYRM6wm5qgLxAJryQKsI5ZYT6ywgVhjI1mITcQGm4ktthABthI7bCP22E6E2EEcsIc4Yi9xwk7ijH3EBfuJK5oTN+wi7thNPNCGeOIA8cJB4o1DRIRJRIzjxAeHiQQniRRHiC9OEz8cJf44RgJwggTiAgnCKRKMMyQEZ0kozpEwXCThuERkuEwicIVE4iqJwjUSjeskBjeIHDdJLLqTONwi8bhLEnCPJOIhScIdsgi3STLakxTcJwo8IKl4RNLwmKTjKcnAM5KJ5yQLL0k2XpEcvCa5eEPy0I7kozqQArxLCtGSFOE9shh1gCjRgBSjJpAleEJKUAApRWNShglEhdGkHM1IBXqRSpSAVGEMqcZYUoNxpBbjSR3qk3p0JWo0Ig34lDSiBpAmDCNLMY0sw3TSjN6kBT1IKwaRNowg7RhJlmMIWYHPyEpMIatQDchqtCAd6Eg60Zn0oB/pRR+yCbWB7Ec3cgRVgRzFh2QI75Br6ELuoQzkAZqQWbxN3uM8+Yah/ILGZH4xxGB+MUcHfhGhFvBL+PRE6ZiPUSamIVqNaYU6Ma3RGswH6DvmLfQbMxX9AV7w+3JUgD9oqAL8WYiP+M9+vA++gGI5pb9BvzdGf6vPtWc4fs7JkJkUmKRqVaQqhpFZZc+cEPQbd8DKGIToW18oI83iKMShBs0iKCLsowiu5LCxKVZVapFEC0AUonMoRQWIijgIHwDSFZcSnSBx7R7dEVEkuAIWVAyVoMGysNEdCx+laIltKjBwQnREIxo5TgcDFDCyO8G4Co3wMCIahsAUlNvjpDYWEONCSFplAAkINMDk82reWWfhXCkdftwuQH4a42BI/vR9La9kjP+Pawz/SuHlvifvqWS/QEo9L1S3grVWzDXWyCaWdd4MYcMtKmXMKuqwHlKftJQLUhtzDjJU0QJrDxOsHEObOQQg5k19JbaymRBeanG2PABq8LOXHgwMMepc8A4YCRv3wMvLIs5hGsFZCGHCYtNA+vZ8dyprmjVDceIthMWiCY1V07AjSvM1t24zherYuyW2C7n1JcS1kCBxhx801k8kOjLEicryMLRt87fDtNNKT0Ajow182nbDj3SNmo3hxam155FaanaANUymAUWE4nAc46JQkEo6DT1JnDUvxBl0HDyItCFFDxRMzZJi0tL7ROtSemu4hTGpZCqqrJe8vLxqnJXWTwlhkUNzqxubEDKXT+c+g7GYhn0Z5Nwvm+UQkCzqy8rCAjDre++nuXAe6gA3spRSg1umQrmk1KGaZAXdumiXZgZsSatoxeV4qal2HjIrZBjGcUMQu5U6knaPKXz0jqvKOz+PjNJ3U4y4Pxahsrs+EpZJpxKck6wa+GhnwRKsRcS3VkRJV/LySGfFLt/wuD3mwV3aFvv8Bis3ZtaVVbUjn3kxO34sxIoHRvqCItwJwwne/q1i7XJj9yqSebrSUeAy5XYT4i5U+zFWWByJTDkWWdJljJZZdaJ/6RCzS5Au0fCgUEF+PIVMHxn3DTp1HvlgappT5hZ5iqcz2By3xx3GPI+4LsV80vZmR/7079GZY55Lxieoxzj5YIJg6jmMsrHyZ2mTxT1MqVh1jx4I5DaUU/LKXxrwyQvbP/1bPO6xd7n3nsvfYe5knKQoyv2UH8R2xyfpGJnYZsvYRA6av+S1sRNkDrZx8yDgVIbDXjwTjDS76tWmlFw4EDe3KpFG3rFJjTQTkjBGbx26LRX2+IU3O8aJM2FfsCRy6QvJLdgnQiIJAXafsmyteR1/Iok/W8OYuIhYNBgIb/SbVFNZEPe+pvNfJQH/0A/aQzQ4qsDiCF0gpayIIFqQpYaU44ifyoMET3v7YVKjc3kk4UeSeEYi5eR1MmE7Chtso5UYMuYf9qtjPwgAzus6F2UmMh8K1KXtWVO57PLA13Tr1IJFdY1VY0HWL/G+B7UZlzCiai3UF/Stc8zqHZIh8Ug455hp2r7vJzK19VJ8kxqZQbcOFNoX9fmAcmr+Os+te3g0otVJSH71ET3dbsJekTr6FFCCkW2sOwOwMmBemVLpcQMgEvnwL1c62a/eegx9rsViKqaw6bAeQq7tmeVFnj2n6hVVOCtYdq5N/fA5Mh1BaP1uXaz9/o2Wbxy5N6y4+57+V/AMlIpCOwcONfrBhrApgJSmoJTlOBjhxj4LYHawaS90aioEGEtTZGPhEA0c0ijc87ULRORTccI6OG0ctp48MXCW8Im0rSKysQN0lzKkoZExg/LGQPjyEmPjbtVN2Jpx67MCuZxC5GhW9GCWzSbDJGZ1A8ko8QHE687dtHjCyTULSTJ/K0OjY7O2QTDBNIcM0crUdVVoe8b3dc101erijbMykzlQahkxHbQ9iXwv4BAR6EapxhxTnucGEVlGHmQYYSmFTIpy2TQZz8vWTnFa1kZyNeF0lJrArILRkj6YA8MFyQzc72OkQClSHCsp/z0x311V90ZKq/LfxFI2dlaRJQWOiNhRkSivqYGa4ziVIkFHhWiJp2Ew/kySlAv8gmTSQChokvXonCwYfyry+XNduZ4T6Mr6ET3c1afqHS0/tutz9QxzV5p14KsGu+xl9QnqzEpFSzaA636W4Rn2dR2m2Gy2bpm+V8tzIRncIfCqLCUykxKAVIf22EO5b+GNQyrVHdc3ar6m5jYWRG26KXc0ILZAMu00Wh/VgdJUvTMJivNqEV6od5PGBmRu3Qcwq4XsXseFRo2179arhZmTQ7c8GGhQU92gKBg1a5ZukjEb7cf7DMuYNgOgzKCoMz/MxUAlAE5RsEwoQXnoYy7qUEiqNXWglM+xqOYHIahUltfP62SyOqavyLUQxmByo9N48r//RR1mqNfJ+K5YxJyUdab5wngrHwI1DK+ESr9e80DoGJ5+39LJJq7UMe4+Nq6QxmK6T1dNTN+lQcdyaVlFOmbntK4r+MVif3mnUNVmqqkcTWNfagQQsF6btBYK840fLIfbCztZvfXkzlWqzfdTa1A/F12VKMQWonhyTReSlhzcFSVKFy/yL7M6VNUYbc73l/69h+64+yI1XttNXjrl00Yl0T4pKVKWjRPHJMXEPt3n0Rv3ncdwYg7AqvkgJC77gLlgdYQtU26JLAGXm08X+DrhxxX0mNqcr23i+9I3nCCJogb0m2jwT+I/vI1absEuwyfEzLBlyeEK1X+S+581IqSVJ7g555PW2YQkx6aJhUFE5oQCKg5/cAW7HEAnXlabPP0CNf3g5+B6WlD5F1MS6RGtm/G0W4H5Qpp2IP793hV9bfLB4VZqf4UUIFrHwqRBEflGL8LG8hMmJI1zFtOyLDaKyU8Ew9VUdikXk599LTQwR5fzR1ARLt9jE1gJcCUhHq2a0NNBGpvNQcNBca0tz8xYRhEzv9AI8CCBvZwfrdLsRc/EhQb+BcxvLCBhk1sDI3ndfEET5CsVM9ZEydYdXGjQThb3fPKI5kba0bFIt9tEFyco4QznvGmsZbnQJ7Cge5OR005Y5O8J0rx5MHzKhZ17A9UFs3oqm9w1HVxUTDbmTlgiohddpqfHqnFLrcH0bqVojppZJ2zctZNbqw2PBo0oVf4oXXJ9So5lzzjg8EUukq1IZWQ2QvSYLJ8DUxOJrLLsYPpxGCI9pqep0fYOCtsZfbH7IHJYWFe5dv2vIVh2iflTwak/AFj1KT/PM/RrSybdSCCgzOhLra3IhTEQBNR6LcRcFkqmZqwPPF2TmeosuBBRPp+LUnJfbjUPpOlgMJeYv9SHL5pMQGKtlJGl0z1r3Vd/GrHcM5fZORV7ndHuwAQ0yee/QnGG4T5ubfmeRgJjYwbQ7SoLNxggaAqw1inEvnUTYRbGD+0kyJhAV6NmvM1jCrTomtGkccFhlrCd4KPs5+2YSTcazXNBDsYxF1GwHVRjlCbVeDe50U6eW2MtDm3ZSPJmDvwJQVpZ858iBZyhBr7PBOMN4Yocit1+hRBxtobIikp0H4qoz+vjx6SaUhRRzGhTugeM+7yHY0xPVk8XebT3cDo2tzV1VKi8FgAQfz3gBY5Y/t9bnbG9T/22f/yBdu7EiVvyGHbnvKey6qjbtUZ+GtGGixSRygdPCI+NRABEWh1s/F10vXSnP2xt7x1bUQG6IVTI5pOFXgvDF5kcwGu3L2Ydy0nMESz2KOWi1uhMt80xDQQCh+Jc58USUltJiMehu3JByZSIqVNsW8nCtcrQ2fOPKw6EYlneJ/80zipWp+Vs7y2QNTld7/nrnYEpHYpvn1rXS7Q65kJ3fhBRYROy03eKEBhb/WHRLHiYQy6hapv+dJNRoWTTXDShndyLkOxwEWPIMnjcJa9iOV0IaKmCU73fFqenZoKzs3wK9VmWEN/4CXJHBWrn8PT4bxp2C3jz88u7N7R6w7FqGqrwmAQfCeqbpyEPbYn0KBZ44A3sf9hh07utjXtb6Fh0oDjM50TrjogiaQH83WtGA7j3JYD9EP9UYDFDrJuYIlKEwo6VmVLlrEWGDvChzucZjYLJw+p5bNzIlF8oddT2lh9fXOfw/xoZ1NcDkWObko5zsEsDFajIU0bMbLZibNTcccOg2ZZl/mm6MZiTAZbb3Jc3pzDngxaOG+3A5Vp5YYbtRMpqK+5zXh3lRO8MPWzKeYMY0kEgmv82Zl7FtkjCRs4QTTpfUBM4uuAYK4oaSy3mVCGJ+g0vz6jQ2S0RONxIgCcNGUZIwqSoatUmbAlQHkBGDbkTqXo5dO2iWuJ4uxz9GY+f/2PJ4jzRKi3otMZW1YnqqSCVWJHB+Yk59LQhx1XHDXvYMyQpkrMaNqMskbGpFpR1SS0xmiv7rpiftGyYpRgz1fSD9nm2awazGGUjSeiOaZA5l00s3dhBX2cRDalXOko+zQkokSUAcHeSWRYSf8iJv3/rl+ZN4nLhJUTR2DitwZSyoFiYmt4G1j2u2NFcJMIbzJbrdwIu3nikbtqFn90ENwH/GZm0VBqqWVKfODHx4fYGQhKlxd/wMUavRI1DsFFtWBnhls/4IanGub3o4jwP3lNsbQjZeVaNVwDu4yXm3l1ihas/Yw6yCzYtsVE0UXqqWCa0Dh4gSpU/g2OLxQpRBvWrhJAhjPACL66C2Lbc/3OzmLuMgvhz99v5f69yj+VCiXNlb45lxrIoA5sXBp/iu/DWR7h9qApbP8tS81+yW1Gx3ki9fISOlXDLkaDsXZaGl4xqmB0Fz1u82BvqnIb/y88giW8Ev6RKIY7Jxf5fCY+AahPpgPBn2w0w9fS+BR4bm5bufcrDd3DbXlG6QdjsEY41cjmc/NdYITz9NXi6fsSck9UFa2Hi/kdGKhPxJVpfSL9ONpQjv6cKtdMEUYxrWPGu4W05TC3hPIJYeWAnYNDnWQyNdsheV1zPUtZkJAfKdhgamjN3eNhxxgOrQGRQBxOcy4u2wGXhwvUsM2QBeKFpjo3ou0ezMwOXBwdnJ7cqaNw0RzKdhO8hirJ5of3TzBMvPviwz+ST4vgyRFNNknFmTR/N4fTj1MPtJ4wG7Zu9UlSBfhUN6iSubWDTMoSRSRoc5qv1kDeYGUaa6A6w4td50lfASaEuQku5NcLay1+imBRt5HwrMmNEwZIZ5uUUbR1JeS4YKTjsuEUEi6bfmuShhxHh4iaKMgZuXAyclzXZUVMe3hKSLVuoRSp4DPL2JyPWDqPLan6lDDnycG3XCPpc+KgneyzOjWD4tl4oZIepZHGbqtIxQ556FVBCGozdYjy7WxeFW41nEs3M93TRT6aYGsj9mA1UA0GQtGkyTtPQkkDKjjuOlcIHBQLTmvmrrFfJfbkZ/KuIVpnui3Df4oHd25ggW8bsDT8BB7H7ytS9r4Qdk/GkSLcMXz7Cnil57FnuVoZpIb6A+UHNo0WmmDSZ7kZMGCmGDeY1IaxsdRN6ikHyuO/gJ9RdK/q2Kc096V0/xC8NfMFFLLBxtFeGDNMyaMUMSu2xssKMKuFaBmkvGi5LfKQEUhnTqnGs8Qwiw/vDbYqHTrxT6Zi2ShE2BsaWpJjrPdmauTycpQnZwSzYsSeHCEIb/aAQLfIyn2bdqbjVuT6VzNyc5hokBc+FBBsUa48V/hrh2A38YSVKqM+Rmz2QuqpyMqVeRQTbmAYHil5Hwz1jYSClyEbEYHl26P1eCU479+EgoIz5BG3FOBaOUZY/ccdrofhkj/bx8wTeXe7cumaxQy9L/mckqeyNgifc6uLt50ZAuXFvTVFCmnm33NZIfeiyp7cWP5z5RXz+qGGwvPpx+LLa9hTd8JgNKvYmgD4z4Gzwy20J2RlOsLIyTpDxLxN+4jkyFmKNhOn1opFroEBVKkgrZseviBULZRElM0HutBFNy68iAc66K48ArK6UEjsBupBhjUJOP4OoQuG7EtUNnkT23leRkkwBDJo35Qm845lQgLjoEueB2C1w9H0JxmEYzWXqkyw8fPrIRE0t31efkxyI00xQnHIG9WeS4pGGxaDnknlBNCMYbAXznzFYmQcqyZnpLEB9JgKo4fZQgTF4zadJTpaY3PWwDoUd3rHO+SG/MXrwIcoIq+xmjHo6TBWILnk7q+xzXIvRVkTp0DhD2PIkatpIEr7oPCQHXnsFByRaCltOfJXBJZBZGlM1QMBPHOCUh/WUa+QNAhkMmiJ8rfH+qJeUuOczVXQSjR0+WTnD999dRFKvTIQVd2x1dT5NCGEFFt1aHyt2Iyl3Ky5dJDR7CTUDVlqWsh3H/CDF/Sj9A3dCRUzbK7p/caJwFOHkETvx5FTY4xwPkYe8s3VRYfWaBRKLfEsOCV3GtWxvTdGHWSEGry0/GOs9uM6NB+7M4J3He9K/Ob66cn0UoCaYUQ8+Y61rpIO+409Ys+L5LnBli2vJwFYKKGyKMSKhBA5Txi0nQSQ7jplWy3nPxk4lA1gWPltexRLMEuteAHJkOAn3EkpDi7Vx2XBkV7qnij2N7BZgPaaX6D32d2dG72r0RTRSSyMCYIaMrHUGUzXhyBCjYLfEu2eO+b0+EV9IZlXGJC7i5eaLnE9mkDB19s99BqIFW8pMsIPFPt/ayvOdyvQQbpIhaXBOsmIO7etnGk4wukfOVNRmdtaT0dym3IQX5Senythszx4vrz0jdy76EWv5TFdHtPx4+bi9Yra3FzKNwh1TaT9QI+Ce5QDbbccgzlRs4767aw0f+dwA7akvpJxdA+sSRREwQpZZaxrA7QtgBtjck/33aUVcjPKGLpjI5EuUVTX1vqrwPNplWUnJXMLQUGeS9V4BufEQzW09Wzadyca2VPljbo4/t7ZpubW6kBYLmAq5JUbIzSzpSqQxV3DBMJossc+eCnwRA8DEJ1b+GNkgUvO7Vzrhn1hLDjV2NivPVNw6L0xtxQJceAp2RqoF3VOKQpVAkMFje32Pr7UcIwxmec6+I9wKqofYD76KmB9RTN53LPsdish7hsNnCccaI5gmiCUTVAhLY/JlkAV/QRD9wIbZhwVVLvNjQW0ZNhZ3qFyU9jFwApVxI9thaOYQpwxjQ2hrZpEHpMhhUSKem9wiZM9iJYUZaJQm0lugktwq+JRmDf4hJRm3ZsoJHxUlO5T7YHLmSSqa9lgF1d1uDznJOTLm8gniOawoDbmv/u/mykEhffZb9Z+1xUvZT2OSHfaa312Y3ujTiIZ78+zx7sTRW4E0Mr78+N8AGYu06rTyjBnrrTlN5ZDVdJDHRe/7tQbY19KXlJB8WSJZnG80Oku0rhSNF9j49NSkV9ymnJEZTU4ciYoqGLEA00kfB6A+MxVMaMyndbAbmHIBjHHzV093J0ItukG18uJBgrfV3EgKh5x5Bg/lQj4kzyeDQ5Apbszcs7ezEC+5mBplsMnwKSnKwhZG0wrJYrYqFAB2rZEKyOo9+agDZQG42KpUzDs26mj8B6Enz5FxtE7dZeNkZhlgJvKuFfzaa5LQz7vkJJ1VyuGF2SAxhmvryrQ9gYUubWd8QMsjkoVHDNWCseQlEfpiCCFi7tOcnXo/vJn/HRwzWQolvzZeycy3he7ggD0qJOE/Pda052keYnrAM4Ga4n0HeDVDapce5j9SNYDsbxKCk5rk8rFL57Tiwvjh1NTTffTKZKagEg17dE6HgjRG99+8cnfvjFY+W10x93Ca0CGn03Ymo2nbUps9dNT6C2lHk7Kv685pHwjbzlvm71WABrvdy+ZYtXMO9nR5aUhk+CbiEcru4sn6GVr1vq9RxZxo9oZPItWMjf8AgvqSad1bWTTbg+7W/7oVIe2AI/m/+wLO37jWhSXPM2Om+5gOKynACmZf/adJvFNIgi6fOsDpiGwMhRya/N3DHUlRj1Ff2O6vnnospusNXjMXqISZ7z2JumVfIuBYycAafzf0unI1BBgC4FqLlbwRo/oPjMZTQW2TVU33D0tXDoGX8Nr5gorZawK+Tpb2d5v4twghJAIjaQjJ2TCdId1W0tP2xDzJcHalvCz+d3Mfbpil2frWs0lrplsdLzfmdksjnJytL898Zxovrx3/eDFSahlz6HnLdC7b36GrMUFq8CLkDwP8ZGVD/MwMkjdelsgHmRR8XK3Yn2qETcDAVmGaLM33sDTdG0BsMDcsaugMU/WH17n7YrogRFNQiA/pZt6m1U6J371R82jAOFjXaYkN+UOKwsZhBRVTCmFIH08l5dv5Docs94aSaGY4G91BBvvajfkFwhEvbBkIOH93bS+7hIhbFBSMWA3tppQM1adjq5yjVpdll/vOr48blBuzEznAxxcYoAM8KFQhCyeEnsuJjJRGafLelJQ5fufLiPE7gsGQwCoS9WEqNKvd599Ujr+X+EiS+sTfuNqhzEw2R7Tf2DtDVoVKS80g3TkZkjIUnmS0nYWBmDn50BJizlS7Sn6vrpboR233E/ghurFfbvnTcolW3FI+MWURVntwqrWxSW7IKUUYySxsV4NiRxcHbgvlZbwnKUxRf/moIMwcGn+UIkCZJsg1QQJVrg3ljMl2o1NbDL3g1gmfeRPexc/BxzaxbV/GL56FxP+JcgWT90ikkUfkn3haYurz2kz9hWeC0hQaUHC5Me8Nq576KYkWMkOk6NYdS/QueXbZXlbYsrMeMu07ZXXbxNHoojAW92huXEC/XjDBEx6F3Pi9hmSBasXY/wt0+nBd3EMylphWGwzKMsWbAR7pjDLI9Ymvvj0l/irKLTz24XJ0prS6MPUdB5j4vvXPRHVx6ocjN9M9/vn6dTcd0ozyO9LkR58q/4OYx7ls9v6AdXSy33lvWoME4KLhzPgp1o1Qme7nuQm6VTbTgQyV5c7gxIUOvhELhzR/vCYyybOiRYTZ6T6pZPylmmSh7i0J84eVZhLv6CeuApgGp3UHu7CTFp3HhYwPLmy+9XMKNFeKsA88pnUsMIU/KyJSkmHSAAMFcndafDpQGJogesmCXS2ZHDAO6fxRTd2pXlmtM0awGG2U85kuekKOV4eU5qOCs/LMcTN4B6xnUHe/QonCEU9nhtuelUyVXO59rrug0/IbTyVjQrACR8zNu54TYOOLMoe6/V8WqXdrYcCb3nz4ZS7XbweHCPEw/9iiZu61sGTSIPcZIW9fHzf6AW13LVTtFFuxiWqLdO9kvxAUQ0a0LvuJ+F+TMOmbdn8bsr68fCeLwnbWdjfxnaqod72j3OPp0OdG5YHBxxUq1aAN5UJXrAhlMT5KcIRLF4XQTGNPbnvrJ0VAMqpGA3z6KKf173b6KR1YZqdhCU7sPjwFpjvkLq9BQAZb9Z6Pmrcc9vkfsRH+CC4zZHv+UYZyCw8h1M4gHB0u7KruLHIRAVDJ/NoiQ9aByvC0IiMM/G0PV4xd2U86F+KxiVauMyrYzisZwxtTuosva1rRo1ghMiOBaIYED7eF2yVak6lxvSLy8hZJZDVFMPob6A5tBvim3KRAmaUDgwYOIX+ZcQOYW3xXd6UuzRCom0p2CN27qYrNdMNLc/yYARpoGtaWj036SNZU6SF1u/UK6cqU6NxcwO3KIDfqmlT5JAFJJalBCSxE63fi/APPeXBzzkcZ46vUowDXzL0B9k+OzrLxxRVByBiwT2RaolmQe/FM8tyqdqK4cg0cVf+q8niMIHXT3uDhltfKbSKWAfotwVWTMHqt2cEFqoJeQpE3bBkFWUw8jzkA63E5ouepCPN/Gv2nMNO23JIypp1j75On6zBmLobdZH0BhdVhjm3/tjADd8wiiFixrfMGPP06Osw+qyx4JjMznilqIu+W387l7s+YZDmG6iO5tcbGZ/PzU/n14NB99PSl7H2aEs/SYYAPZuj+xp59ZeuOy6s7/oNtbv6wZpm3a0jbQ+1d64rHj1x1jcCeHpgYvbM+R3dlhU1xZHRFR86c8D5zodAtlIrleryGC2/46PFORpMmTklvueDCH7u0hqv7pzODDD3N+0v6QBv/6gIkqBp0a7ET7rXU4cZ9kfmAG8wbm9Ha2gJiMU3E0d45WV8ZHW9Xg8kFtR1uTfNWunRShHvJef0ba1ftZantkJ41CrkRrz1F9uIsicJ5Uy9LkLqE0yI7T4gOt+JGeXKrAlKAS4RN1TkGHvwb/YM+jL6kI5AHHXA39KMSeqi49L/z8j5ZIBFhIfApX6KYjFsVwcSsZ1rOa6RDNYDXlKKxPr6m0IYIdRuahaITZj54GvmRfQXerWQNiXVzrCf956CWS5jzbVVUN6FdFJRKaZCwEtE35XRTL9/evGetTYZKdZIYccPzQIpEslHNKpBaZXwc7bcqjepuom2DBi5E+5DtEJJdORj56vHlBLQyIByBMageQ8cNanpoH1T6KGGlE0K5QRIlHQ9ugIxHK8RSyktGAr4OMh+lCbOJGXwFGbyfgsuLyp1/1gpZmouUGDQwQcJ1ENXWdx5ijEqfMiL5LnjzogoOzxo6mG5y9L/6luJoQ5HzEw/JFES1xsBWB5ptmXmDBwLmIxAFrzAVa2ZgN/26B85BlHTy9HXvFL/2ghgNgH3htKXYsO3pinpn5sJhHRp7D3eO4hu0WnzIh+NIvRpFwylH/HjS6HgrcPygkWn5xw9WY/XZ0PbFQ3Oke1/8zcVMUm8lxqU1tCrQwiybLFbGPdYNqNMavuM/0UE0rY6Q7hXjfh02qjIC05MabtCuJjVLGp164tqn2e4EjA1YnvgG+/M3GLIOJ5dh+yr2JmknO7cTggf5fN7WW/yeBaYRR6oXO2p0uNg9bmhOxUrEC9uVbEuw5xOzRvlA8P8MCKDbYAwo9Fy561PdT2Yjl06ei57IIJRt58QTADXB3DD3Kjb4trz18e6tohvHBrAgsXvKYBhiNwZcX/e2t4/PNjrd4dAcUA4CIDjrCuvWxnWoI6EJs2aLq+p6PTRBKGunsSJDWr+O1qxSPZXkssYofx1CeQCBoeojikLmP0xVg0lhaOAhJAQi2xbuC9vNcOk2XHVY53E7KHTG0Dq4Mi77dZMYDeDSQbmpQw61aiXcwf6wfn9NYH85kaSmQ5P6pBVDH1wtoqaNo19OrcFqGkqCHom4tCDbb76uzplWQlueiYgSynj/t7imDbrIjVW6N7IlwbZt7EnUmgEq5kqpCFM75GxTya614kcqnBf+kYc1XnkKYuMQwJuuSBJD/0YGsWk7GKVhmjbzVZiisC65enbrRBkbwy3c3go6idawUitE6cLZS08QSyKYq0AMDsbB8LCRqjT0ZBxDd95OgUNBCl3LUB3q8zbXhuvrC8/Ktq0SZknollVFmAI+XtD2M6V+d1aSnruFyhQLgxYCvCK6/4k4Qh4TMOa9R1G/fqESvbjRATFIJcSn7tuRe/cQcNsDYlC5ldW0tfTo8fS621p1So+n+wmWp21pwwl1e9rE5d39n0cb4CCiKRcx+nGWzCPPp+gGdMrjrbIECG8Nzy8th9RXVyfZNgQwy8tu1NdoMueUTQT4285JXd+vd63qMr8xQI2aS2QlmmmOcPqPsguOgg+W+PQfeoJkUuNiQzYXG55B2vyXKwyNuRg4KnHZCNEEtdYpMNE/Efy7MbEtuU3WP5bZlNx7Jrm9tCE8h087ZLc/1r6d2HYjoe3WI62bk387CPdJnnKzcJlq3cXCrWAe3SYeLh4mbhRpMtWV7y1cvPmujvbbWQMW/cWGAWaSPcE3B5T/LimZCXlJc0sKgs+yuYyGsiJ79RSV2ceQA301ha08ivWrfo6u/OmusaBqjaBafIYIPR1JC6jsMdQGn92E7m2JwAMSqfuETsK+ZqGeynl31yPFy2YDlzXj3cP+4hO7fy2LXocjPiLOzHTPu3dzp7lZPeN9k1qTxOf1Wv7+siHh855xoq1xDBfiZrzesDtzUTPrHSrL/hwj6yg4mgUccr8X2PMX2zVG1wtPeuqfFAzred36zpebH6ZaUBdQzllwvt/iWnRSaLYNFovqyqqF/FMLmuVl4EdEaqxJNL+xkR9jEqvRdH50Y1M0P9bkHPOqTfxobwyiig4xDjQuLjYK5ATv5YQs4DAHGoVw9gZzAAD78yF7jYONGbA7GDd3jQMdMk0DmCIDZyXIb9JJDwK/eBIoIRGSOugFEoiOyUU8qTV7n4m6gTeQ20rC9kXCRV4wqSsVtNEo41MoapwvI8u7BXLMoaKmxim0NpC6nhQu29hXVbnPsVOJGkcGR5xc4HFKJdVFylR5qFimFVRYnE+thNL+SywRwWuAY+cfDNsfahIluUsiQgN69vp713bYRf4YWdS6qa3gccTip34ZPAFPLCpdZR1xh+eGjzT3N5EuCQ6DE6GVmQbyVwsB08iEBlV1HlcZpLJP+btHeSeMN9fVYITpB7anildLyiSqRhvty+Av8DdQio6Lld5LvpWhRtQbM3SDgzsbUtfVCQ7pMI/mpXjDGHxWh5+LHPh90CIOaIy67XgrqFd5kgCn8S7XrnGnAElfnPSbdnUx3y/1rlbdp7k17pH4AAIEoUhBTF9mSI5rgj8caOsEbeRc20vmjMLd53zjBHmuIR2d9hi7ttWLiW/7OrA9GOK69rJcDspF00/ah+vB2RZvkesJzQCxWIDtwa6mFaccLzksXzWyeHWbquPt2rLzbByOYa8ms+9tUPBCuApVgn4B3j3y9b/LHfreEotBofSmG3slixZgSrytnXrHGlqlT9azn3KU9wbQ2PkoBoytj1R0m4IA4DLlCgF/yFwmglFUeSozPAX6yCyC0nOsmWlGJCpwAEtQdFUUiIbGSmin40A8LC/dOiSPOhMKiDpO8F2fiHvQNfgSo51I06WsBHnqBqhpMQPVDHaIVjGhAOMOR3MFibKx+Sm0wRhsF3G5CxvBnwloDV5VCSUasklKnXFtdr52ki5tF2zibZfD23U+WonarDy7OcfbBNJtSGsvfPfjgEvxMhq9tCzAZxj4S6X+YFgSsLffttk2e7lkRfnAwAlfEAN8l6vKs9izrPLKSjpDH5WT3V0IHdu3f5YTGqf6ZsXeB3289/ZHxIL/I+U9OQuKMs03VFWpWI9ZKjD/l/uwDhMkQmG2ZcMtEXf84RufaawFJlWibvYCBEAzY4S33lpYIoInIDqVCVvc/uMLkhhiuYze6hcv37Yt115Y4jVxwWVnVFQDTWk9NiH+vCih+2gxk83Z8OBiw0W8Pw5Ii28xgeMUgHABDWsSMKit2L4Jwh4EubLq+O5ym4jSsYDPg33f8WkWrNhILtovdYf/xrZLTyNQrW+UeLnLMnzJUDEKAfTSr1/Pza5Ycg4FoSgIMWvreesUEZ4g9Bym86neehyGtMf01PWRlBBpq64WFKCs1t8sN+HL6fxd0ZukuGBs28UrePLxENtBPZIYJi6HzrSzUBGXEv7SSW5AwzBGRw8DvytiSdTpjF5Aq6jvlCVk1WPi0yGlPW2JEexj3Azx7H1aO8y0WXwTSEqPthdDhGLJj91/kdwfXtupS02In+++TVj3OMSVrrYTw7qr7f4Ci3hOvZ3NV82SOBhcQjRKqqIvw99mnrqpf4vrX74HMQtkGKDxZhyHHYFkh1sN/pqmCsN1x+Kl+Qdy10Qb6BLpPXpuLzb9JR/wiqhdDClhA997iaZTg2FfzRPMTJkSpqj6vb1KGeyy4XDl06opDuGTtILpHHQxduuqEwT/6K+8VH3+lvs7I5KDLbEqqEb9aEM6+OKdGMUL51ZXc2W8yOMACzi+hnBuFO94JE/GgHOASB76aFo0CDUOMl5SYhzICR0QWMABArg4EMKcVVJiBIBLsJZCjFcuDk4IXglZ8z2LopPj88PwQeHYPT7CLH9XM3aTzH1euu6GOTMEs70qsc0TcBB1P/LkKbJPbFaRPhd3Ls067RyIjTavECP7RtB+RD+VVui3HbtdOr/YkJ/nhmy4cnU9QtBeyAY3fp4hltAYDufkQuEAgPUwRE5w6LlwmYFBeIRGk9CEkZ0zBN9McDGjIxGR/Ua+VECNwW8q2qg3MmJkNIYaIxLFjD7b2IGaCXemufYe2tgIfZegwT5r7QSaMjvgs2eRDmS15zrgoMNlLA3Kg1euhHPhPCTyYCRWrSwbo9WsFUI6NOEjA8B+8RvtPjsRZDRnT0NECn3dOQ1KQ1vchF9aZHQ++2+QBRjugx63TkE748MyUqcOwe46BLgYIuK8W+nqQZIUyp4mTG1HXAQTdtqGby9PiA+S01toJBrZBugcPBehL4gRTuzJNFpubJmPQqkqFkRV6XjdE8GcSAEiQqEikRpEhAhWHag+DixCkOKOGuDDCga7wNeTTJrTFAOUgC7UgQa/vt7KFQVAgCCc+AbDYBQigTXF0JHmZrEOwJwKaHu1zwDFXBGogHWHIZXgIOC+MePq7He+iDKSZrizKm1OdrTU4xdj2xpPLZLb3XP/swNykdFKHseI+lkTRbMNdRxIUl4XQ7wjnPZhUKRdL+HHrIQDjVGcVaa5OyLA9ZK5aLoRmTF1e4JHuU1Juz6I5sYA/elJL/SjqdtTsxQjenTh2FUgFoOrkFgEXaWL6scmEIkJbvQY+lVaDLhKjZm7CmJowPnwrY9DuqNvPNH+fcQAwqfzZEebv+81UDlBIjo6HEUXaZsebApwiz00VRtOpg56tXuRwP6wQFfBOvqWVUHkUA410F7g5x7oozzOZeMy3ZYuU9zRuQgcgEbtXQ/Oei+/KzGOjPG5tH/r//knbW6ccby+fv7Otcg+1TUgvElESI2nGiZET10LjLLinu++w4phDwz8K/8X30J2zPnQfYU1l6MedIpEDS31WO3O2XUTrn4cZihx4hxI7ByaZPawKKwepmkaY0Xe0XyZCwA9yDw/16h7Vc8T5dg4dz4LYkJQqMtQcautFCC+xvqBSKGTr1dd/m+o97q0Pn/1nevHeoej1O/yhnr/u7wqXx01fKz3+p3V+fVSYN+XF20OYaowkDn2YPYtmiqnVFHkVHGfe4DmxZQfl0o34DdI+XyCrvByFi+T37TBQdJAaOjWxetKw09f4aofLNxbvZdM8ANVFHzGoZpGH+jOGlV0x2CFL4GoWltTRwPzCYASYzhwzuuJpkaf4Uv1PX/AMIbyHgeVWHdn1Dw/wOHX3kUbGaLuoO4aGd1twQ2jsF6MDG1WZDFj1rao2C1r1GW0cUZmQ3FDeRa0Ks6rC3cdD9E6tuA9u3Rf8Q4+ebWmJZPxCMpqUKmLs6BRWtkadQsCXLcv5IRfNHZxIoCAm6urOeG8iOOYk3FKfGcgzc2VGvgZbgIIcOQMpIZ+m3xOZqVxeBPpBB6F1hg7aGFRIVaGKNdw0bBlEQhwEJvkvoCzYBPOadV259W4dujs2Zx8HPnwATkO0IG3kOLgUC0tf0R+/viBF8FhB3yZ9f0HZfCo60BIuM0/y84jMWz/UK2u5iULzLKIH6x1wuCV8CI0YP2eYJa1YPv5pfFwKJvtN5p88EVI+EFfhnpgYL+UuSUkrF3u0bLE0jxb/+ZCnXB4FZxizTN4om+ebVnwqban3fVNnYHbxv5aIPBd0bM86He9oWt7T80cGPxr8+azZzMl+GtLJTgchJ3l2nH9/Bh2DPsnHUAEvM+KNCLhnKZxBsKbz73OQYmFlZFQuXDRTaEq57zmziKjyNm5KuMOn4M8xJpyjbsYOhdyeJidTiCfvqBO8bxPn0+gQDPk9IUzQuVRlBQelZupCeUETMAF4tcr2A0e/P3QSZg284ChcPJuj90hhKFaXoewaEeSfcKh92TMwFNt4AGpUaM/f51B3QtNnEF9OxZYgLQW5IlhEbw4D251clrt4irwcWZQA9aLCm50t6CUBNxS1JDOorIWmj9kLpC4ujjuvUSZllrGLpsHY8BLm4QTeNSsiHZ6r0lP/oUJ8Fyku2H/G4ZoFkXxOM477kEJ+DLe7NfdILjLmbiQz+vpvk4VZr09ZfAy0VUEnJfwtulxy9olB9IyvqQXEFYGHxtIOW9cf/n+NZy7R9HhxyJ3FMikp9YG4klK612bVIlJaUfgHkXu7Yh88kplUcZgWruEhHUhrEwGFvX8y1aHrLb/x7M9rGb8a3SBF00PDQ2OpT3/MZlt/GOcpFY6SZjNy/SFt95YTivtfmOLjebemcfdcKWsD7yLWW+5znpPy5tqMd/0Sjyq3OQ+RXJ5y277PbafqItrORJgbL6HuPMuSEYzZZrrborUJONEjkz0VK99ez1LFMxRRQQSijDpBVsUBhklYguf6J3WJjupgWb1vq0t5hb9Mb6DZlUYLXQeoFVD9SOAfQ6KV1XEw/FQJ+AEZlSVcRA53c684HnhstflS56XXAcsvtkuXQewlWDmkhjZ6JxEw1p/epBgEaMeyjOt0K6sRD04+QXZ+mqbSirIdPI6Mk2PptYKHbj0CULWU/KBE+L+nX7R+FnvZ22QvZxaqzO+oosZsh2aKWOsJS072jjks4E6Bux8zpi+KgeQw6ngot3PbkMORChAkRLoxw5KTQEB5MD4A4fQgz16+t2Dg3uJkAVk5y9OcA2viqgA003qwR4ioWeQ73jQUqT0N1sYABQKyH9siGv/Ovn1lK7pnKVDmVf5AZAiZTIHf4UiAGjipV2Q9RCIPcH7iYT+GDrIXVO4Boig48+uO11/5vQMOIE045ImUGw2KriJATFID9m/87ccZBAyXmaIVupFBTQGco66vmjSlrEyY5jLaOo1Bu4BykXFlbhFrJw4eJqMVqGaAig+WKr8WbEHwVZhusKSWOZp+88tlMdr7XE1FEOoFm9elJUeQ7YhQW+G1CyOsZAcLDGNpxsF0jDLGctJ1Q9abD0lNhQb2xnaATfotlBORQ0OEMke7sXrfuS7ryXr0trnihve90B6xB1FHj/WFbt7kIkDgyiqXAinu7h6JJ9HqYBSDw1kutLW6uRUjM6lNjA3QnqktUUer9amhrhTif2H14u4u+DTtz17HxVtZBwdNW04o0A3JnP3URwOqnrvcziD1Bq9Piy2X79n9epWi7yNTwYUKT36/ffu9U9vyrMAf+hFlMmpqUnKbQdt6lFB7u/u6WnUVQsSi9asdAY6zv/NRGpS/3s+w/+6O128eP/5c96L55OrztNv9XkXbu0xg2MvZu0I4hdvYYo0X9vkcnz9zcS3nxVHtGoSLhlcsihZ6yoo57sjxHBTt2haG2ku+ZeDTUCE1czrkwqXj7pPNNjAu8tzT5TfzD8U/CPmZJU1U/ioy1js5UKfZQJbCYuj1uN8Q+WQMg+S6Wf3EWVZUZELtAP+sosAcGzzknQoHjQtogf2jZ3GLfRzI4r4LDNGZg2pUBAUqEyTg0hQkgY4zPp7hx19L2d8D30f3fBwpO7lXv64c8RSfTaBv8uK+3SC6a6760X5a7toNy/+NuWyp3WP8xStePfjc7unwB+1Gh3gHxGRXWhMl0zm6e0PMtIlEedjizGj9FckbK39UdKrUex+6tP/qXtECHXF+TMdpO2YmWuUbZjtV2e2U9LQ/aGuAQWFQCBD/7N/838XXhhsLN16U5agF7C5uaEg6Ez/f++Oja9tXRMZW1+cLT0eMLmXv1jfP6xwJUCqZX5+aDS6ZCJ4bWfzc7glogZRA+Fg1gy1wENDcAvl5OzslntXawzaf1vLNdf5MWWMtPx4PIUTGkGgZN2OR6g8oNqxtRyGyuDerbAKSdvyFIiWitPg5w65gXZ98Tk3t1R293B+kwzaJXlxsd1rOn34Xxmxkdl/vNqMHcqdcyzS6/SJHn/e0h//fSskx+SPa9lNpm0A6DcLOYl5trwlu5zb3JLSd3fWrLWp86v2gVsRjqGnPYv0Tcz8A1fclH32T9ezJtR/PY6+jknzjpAF8VStjLyiLON8XSlt+44Ll9tFcw7dpkFgfIvi18JJu7cLf601CufvuLb/wyUdBw9bS5MDxthQ44BORBC2JWgRGAKMrX67piOMEmqubBWh7sots7XemJ2T/cYk67Z4vLrubshqg7n5I5OTndOERyUwE1bEvlqx8O3BRSEMzP968qZDY/89f3b7iM+fm8sC9B8eXJ3stZDflKI+8s/zV++e3DuzLInJT9o5/hU21EP/f5MOJ/G/qyhGIfkD176ax5QdvQkJIh7Fb+ZyttxDmPe2cLib7zER48OH/3n++s/te2eWJjFZ+SNfGjHEYz7e7FAkd38z2+YWZBJxKXunPC/6f31546Hx+y/OKbn53Ra2kNkUj0rdPK35PgO+v9lOsAZDmMByzIKtNOEvGI09orkPc7pQxQS94D5MLc1wo45y7cn+7kJysfD/1ULaJistlcMjLVvDXjch2Y3s72AXUaZdi1MIaW+zKGG721g5YdbmA1dZnhutme7Z4U0rs+dE7Fuwb1/U/gX7oQ56C8ON0UKv7agF8/UA3DS/LPetkFIEFnC8NdC+sS6EtKHbVZdMH851vJIFQ+PVYKCLXO0AQfAOs7mJ0IhP3zkSZ58pALachYs41cpq4H5zwpU0MBhrSxzQvNAMEG/62tmuvYOPDDtgSCwjsn6ZnDTTNpboU3aPSEvWLyfuxdG/vEIe0/Q42rRwD9uD1O8dkK1x8j8cW5HU3qh2gX2ExtrOKdHFPvUSVS98vQm313OjsU7+MsuH2RaeZy2TD/LUchJVl0oCiwVdu3RPF7jvCC4jYkhADyJDRaRSR9ai8hIjMYaDgkiQHug2xE5SH+Dt3EXeLd4MbYJ2e+OTVh/gjRzkrfYb3ew2xWG312Z4E7zHy2GPN3CDX6p9RD5qCoNMpNAn1MLuhO+rY5jetO89CUL1BJ1CJDMW4sE1kCvq82DtWF6WsW3bsu3LgfcF9UEwArShdNwoK2H4U65S/WgpNFtrcJgld6w0dx93X2HhPuNyo+GBTxQ/jhT6NDtsVG48XNwzQZZWDQSQiNRQhDY/t/Hv0mD6KYsZPLXE2Pkpranx5rDx8M6dbW1cLq2mflnTBQ5oIC97ZcfJbacvXlhOAa4XYGeqlOpClUw5T0nMFKk0ADjkjFZ8mC7oig45SUkOuaPlS6BiyAtlW+3codLx0lF11IgAmatPn/DW4FegAFFNXwXehfV0JIy6cSKeOrGJ0lUZr7tIubZggWUYR0IELlXpZRVmFf7zdqq/PxrtH6CQJTRh/B1HB4Voe0d7tFDv2BJotNwhd/vhrjlzCSiOA3fUs2gKEjLj2cGCthm2VuFWYT+vK2YaSY2YWXY8M/h0AXauwgCpHVS0NyU2w4yH/gvNlRkpuMbKM8+JTd+bRUV/o7kKIxkmyQqT65IzAbsO7L/Z3HcBmFbM36nKjGVKxqSuqfFfUjCSYrky0mmEer5p4GmOZsDAYECj/2LcYW9/9zWRua9hpoGfGRRRUBABud4oSt9rMvlCP2FF/DXZi6p0xCZmej6VfZ3bub3sMcvC7eQfvthZnM10YWabcFksF1bjSsG+BfsFok0LNoqAUH146y24ia3E3kHQA+79WJTWpNZWrXH0VvSY0B5q/ft3c5eyrbIxtB7xrdYkUS/vvIFBvb7H5COinuyhFvgZ+TUKKiqCIs0NfPdhoeCMjGDIYO8SpZM4F+pupmQHeiS7QZFFRfzHh2XhJCIupnkTF5LEx0vAVx+QEA8k9k7ht9YSCMlLK5PhwUwH2/YLvScViGAn6Ryuh9aPW8+PppymRkdGSpUQti2iDlClwvV8qHPEnRwBcNqEVz2eevxYxZxkZp3RU7KZky2ESWY28Vk9qz31eGoqa2EwStCktjji5Iozq9c96pQCHrNmBmUwR72EE0Hb5cMTRst5kAPdzxkGLMRCB42gw/AIBsZZ+Pc1ppkf3QGSSu3p9s1rxRC3uJgDy2RYslqRKuaI1zbbA1pMDAT4Oa4smKWFgTEINpM4yZ4kpHNJGasuHqbMKkurBCKcn743l3T4df8h5Y0oMhMWmQSIywSzrOxAUZagfPhCFmuWNR/jF1P6/PoG4wsOPORB849ksqmjS5pidYMRr4p4SFULJVdBCYXVMVgtKTo+CwqqgkIV2QFQhcBSPxRaBQXFZ0nRZtHYwmoooQpKVtUKqPP3VkS09He2sKZtRerC5oicB9iKCCP2xrI9QEQPoosWwU1aBKctTwuAaMByQARsSzj5OVSSInX16lwTVGJebqt2a2ZWi3bRV8slVkv8fP38ldZLrCEI2PsQvyE2AqPvSP+phjWDVB51FcWeOthZfKofVD/Bj9PlBEIMY4zhBj4LxmU5CXomvOX08ZWwrMtjrKIuuKK+riJEAJ7BFXVjXR5ohB7Q7JiZX2yBnuJ8C8b6ZzY7gu/GHztCQ/HW+NCQztSDpzmzhFTRHGKNmn/6o4CK2kyYZT/Cb9YLCbFuwr9lZgcvy7Yjo2LDoQLYpxF+oIwERoV2IX2EXt17pLNhLTrbp4XvKkt9Xah5f+GpTPcflygGI8rl/3DdjxemNYWvU8t2yUnviMdIsySTMJKTPk/fiRTGJ80SjxHebW4SToTnqULDjU5UsYMqnDQhy/KTz2Wj9+ZqBZV+izRcFC9plrjXh2HTvmKrvHH4dsy3VOx5abMUOPosJs4SH2oHBha3Fruu/ZA4q+WbodDs7FCoVTj7eIRd1bPHr5dpUhe02kcF7UeEdsIj7dl+ayUT/Agy8+fkxb6Ukl7rtMI5LCgM3Pu3nrc/lM/2GwBw1A5eVPkVJPgvKs3zTBnP//xXPmrOK13kn+db8LKqDYI2r4Q5524baLcYeK4Vi+iTiS5Esp5+i8GFpSHW4nFxXobNQIuHdgULWoPjW9e727Va/CDc1SK8dHVscW9ujQt2bA1efywCDQxOwIdDg4C77+cLUpt77gvJEC1IvDAj2AdEQkUlUGSguS10hzcCmqFh2h1wg9cMRkbpYFgyDOBFJfCONw+HooqKoqDLGLeocHPaMNQORnj3RlDtQcgK7pjkhs8NyVhc6qdwRCoVCNIRCQfgD6h4vBxqRSVVEtstypnQ0RmkLymHNAfX6IO2Guo1STPx1qxvFVmWNO7oTdDBLw4o6dy51emA0gXgomHdvngdXJrI+u7HCrug/qCBePuz121nUK+ro4sTLQCwWXSXl0rl1dXvtUFV3uXZv8GzvNxzQ79nV7lqgxc6Sie42Tkvz7m5y7klL7fZuWvZk+vc0tOcl9c8mRcfhYn5FXnZaZGH9ikWOdquP4eEe0jUeFUy2IG/fbGoRbnvrB9ZPcrDIPwBjkeNhjRZpCFyluGQYRZ5iJR1f58ABBbNyXly3nBXdSyr3VSr46LWnNZVdky/sK19qSHgMI0OoV69RA4hg40PLSFxgwAIAQ2+bt1VQKaTC3a/bjmuexxknxMD5Vja9XmaZLugtv7+ZxQ5g/z6B7UVh//r3zNIWhzvjl3n/f3Is1HUKiE/ZUHcAsu201ayiChu8oEeQNBKfDTnpQlIJm6QD3hND7BG9bljZC78ftr0yQdw946ZM1nX3kf3JQiIzOH72+u6vLBgmuB+CsRBsAL2MUdYSkQZFW3tA+eRc++dbIE2eeZKzAPjN/x5p6/Bc93S2DBUv2lPGRKBNu2F67BPFOCxkbpeXTdSV183/8fw1++Ul0fd7PH2nOf+IHe23nteJO3s8U8vBs+uchV516th8RCpRXX1j2Vb1MDuvOH3QwF7VnSF38k5oSGPMtTXSlARWvtsjf0rha5PJ8uTrj8Pi0nnUfk6YVZumjysadk4ei3ERwQSYZJAkEjL2eUV5axyH18VW9Wazc4GTh9uPaZNwih4kvaYg5yZLKKKxsbEikmnx4S3xKlW/Rb9KeIkEdwTDQp6mHxWD2uwsvOZPa+tNTQ9Ovpo/38cbPUE8a6XVXX3H7y91nb4Ssr5FhWD36idO51+fyRrAPQv2RrZLzTAAgz6t8zv8lbg63eBfMHnBbHq6o5s/HtitsblWWKEvTObsLjhANF+cXbxQpIPnri5U0kMe/mAKBRZJ1njIuE3xlD0DgNpcbS23CWaCBdcww/Q9+Gv4YbppzHON3AD9AHcDXzjju0dx/XSenHjyn7awMnMybiZZm11/7bQmrzSgYMdXOoBAhkHxfm19FdTyUu8QGfsslys1rOonfdn+BfY6moQyW9cttXBZ9jjdqO4LyqtYUzM8AnEpNip5BUnnIoRk1iFaKw1/KKSC5wjS/tGYnAYbQjzBzuno9aZw+ZiAtbtxyEL6gljhD/4sY5JDa4Hu1cilsqhn8X2ULsVZxXd1B7siQWH7RjGKT1YXAOMP4pGHiM1j/z6PYKMIkiiRh4vdSlAxfDKpeW0GBpC88AvF9ar0uuRQkgApJE1Z1+Zviw9nCb1vIU+tfd+Ev4nZNafo9EqtMtBlYxlMsvUD7jlLxSdOvL3mcr8UXr925p6x+3HrBLcxOVjmSxV/X9iywSrY9sdVq/9VnPvJ7Mm3uNTfoMq6/A5U935/acBQP+q7Pq3TqXDjvXJjqttgIN4jaJ+/dwbg68/Yui+8nPkgz7HnuMosBfEzNixgK7AkYMTsAAaQ3r1fvqVAQYFAVURwA/jD4dHUanh0Yfxw4xhdSicXQBFoGzlPbGcgo1QVk99OEi5Yl0ujB9+k8XbsdPmxHJJLvCBk2trk+EUuI8SnAxE3tlJi/nLT0DV+GHmMB5uPnJkKYyg+tSB7LGlHEaiea77JN5AYlN980HRk2EoJCsrBAqGIEIhJGYGt8D9gPP7/j4Kj0KkcCf6Jrjm28pr0K9rCNnLl4Zwkhli5hNzRTInVMJvbZStfEDjenBpy/bmSbuailpcEwOWpZbBXdK8gETXlssgjtMA7lf9RDZpDSl7on4XsnGUNnf8gDCwMsb70qBb3rPMjUlW/lwYMrqvDo2Vd9oUbQR2fWbNnFm4BZ7lDCtNRY69mTOHRMDIRzsqpzZImLz4JgvUNtlHLys4uoOsPY5uwYwpmhnHfKKbA77ovsStdD7VyvFNt/0h1hEwLkb2LBYEyWhURQuWhmklt2Kp2BbgMqEP967QvWj8n6USndjL+SIjbOd/Y/auARXJw2dtW4Ezt9idk/sWrqqkO/uG8+wuXmzcfsTk/E0qxjmXO/E6Moz93VWmazU4qFR3NjQ0RmxfR/tvHfiXkyAMLD1ScoRzIzAissI+tbphV/qaRrud6yH+CGjJFQ4Zx9tH11SgOyfvDSMux3fjPrrDNc7lS2k7jx5ds91hB43jnMubeBUVxgZOovIMmp9bwG7fJFwX4/gjQg/G36dmlUX5AhE4mEk704GLzo9WsVTV3DLoIC3zgD9otln5NGg5dfvCruza5UEyrB07aUeYW4CcBhYeIs8Rk0hzeoA8nMBkkQaQsshUvXlbIXFu3fNBQNIiA11A1iKBiyoyICV5dFI0q1uXWgGAx8wewiRrkiBL7uwdRX7/Rp0hAB5dxsiH+DG8H/VkGhlA+p886QcIjCDok2ngsmaN16ePjq0OrR8/1aV8TL9k6mpaLX0aDpoSEHgbCzh9tu80Yf6LXO+14/nz7H9eMdYF4H4U/nUQ1YRq/HVoFCavQ6hGVNOvg6O+h6AXG1GlBJ04BGNQmfeJgTwWEkOUy2sOGowqiRXTORIJg5EjXK5pJrC9LfqpDAzGKliRhnlWjO2O1o7brRkJC30QhXZgsOlTqieEdbJiXBQM1XfDSRsOpSqwfsqfCj/shfXpTx2rrtRe8bt1b6HTyqnYDtAR2z7l5AXspgP4rMNI5bZtlTBBB0AqD7P4486BgBQRoVGu9vfMUGq1UnOqnwScAwNDjP+v2V/z/+3Cmb5yAvpzTMNB3UDdI1BWW2sWHCACQ1mH9QN0DzbEfEYTyoHtUdEHrsQH7oQrzf1AtzVCt7HQGPhAG4M6oTHaBzAGtauqldcZ3dU4JXbEqpVxVviFUj8y5CSVQ7FS8HfievjyFWQ9xcuXaw4ZDJVeWd9ah+zdA9eFuHevysF79iJ18Nizh5GOEFsv3SpHU2Xly6Fma1GBw82L1JyuZbmwCCidirsMg6CMDCgYs8/A1/xO6Hgk9OXO6hHEeyQvc/4qAfHxQMLdqMrEEfXDZRqD3gvtxlkOfcnQ0irCIsK6W47hYHFQPtCsBwBLMVokiYyMpg5Qo/nr75xOG6BKwY3uo0dPgUzb/bCDegg9rgPy5D+7r1/af1K/qJH2Xw4/ibcD96Kmp5C9FKenaw4ZDHlPAcdzeQ9NHr6bVTG7zbqZqg28NzRgMu7ldZe37YW317gJ+GPM6WY9pTzrXd/t4TEesD58907F6uYwnGpnMsFvDXWv731G+Z/ZDdbqMUdMH92/P2k2bDZ5/7/JK4y3DeN4339kOgKefdA6hkmqXI6jYtuWuohJcHBSTVwmhbg/sZJ1guKjVTqTVHlkPSTxGRqp15GvK2eOglT/eLiLzKDt0lLLrnecMKspzhQIlUoXm520LeXQGiWU1AkE5+xa2gQV7OYoOL9Y28iwXoBQmI4weRuYT9PA37cgVdS+b9XA1L7Vb4tmftdgsgFJRRSTjbsgsXgjokBSJxt2yQNAsohGT/b+minQCTrtEiDggOD2wn9y/ll4GzjfMEM5SK30tK/Zpmyp1Ip7s6k0KacIVPob4VzwMGlPVUpxz7C+ykfKGOzqHKPcuG69ipBOYw2wnmVzBCW4k+ZGpfV1Wfhdgn7UM2RA8Ai4wDQjMo98Vl/S96dPSNgKZ2GHeCOHqHAqVN9kmp+PmL6CzKAAzzcD+lF9/S9fbqXRjYXUOYqU8p7GNbaf2gLt0lB51PfUdQUGWULd8urVAEGa5kDl0YCrz9Ne/WinXsgUhtEokSpM5Li7NrXlz/9Bfm6QOEdnIf5F6NWXDPa8fLGFxgNjauOS53UppnqR4t3Bu0NEUXqmsud1JUAY0fDDbf7Yq3PdzOfIbaas1c/gbpRjXxS6bmb5/nsHDWYmQJDlEq4DBo7y8Sld4udXUlKhkhAlPCEJgEUOfpUIMXoINRbcF3lFRPS2I3fvIduQ7XfvvnIaNAS37VvVBeUeF8WodpTY44Jw65IvX6STlyAvhzbp5QtHP8aXbjJys7d9z3Kr1G29JSu+Pto7aEoEvkqA61YCsS8KlTUCZQ+1B/c+Jh6SkMz92AG68Q0gGtfdA5RUWi2HcD1lIPVlZrG8OcGM74KxzOfOciwcmp0TBhF0RSjUySHmSpJhSRfIzFwJXLR2bSHMoeHZ5yu5LYyn3FgBZ3Mxy4w7ljS88Yk66/v30dEUarQBdx0In4qq7qzRn+kq6nNJllUHQIlCBaxHAnUg4k1RmHQqcd6uIs3TL8T5PZcaKCZVZJ4yjMZxcN78vDxhE24ffQDXBQP0fdgTmy4ciRJrE9TkXvZ1urg8WZRoQIogWb+e9PMaDzIwH7EUptx0Wyia4iTyOsC76ICFl3/bUmz+2L6xm3yCFjgK2Q02/rRGlPjz3wXVA7rdtIwYRQ6FfWwuhvaSlnTu0683KzLuMc490Jec7qlGnG9OCQkwVmvdsBq2Hra6cZZtTzxVx8rUg8jLG0gPkPm3vXf6z67QC2m5eWwzvAV2gABI682hLYimS1/ECjiEvLiB6iHw1dlxK5Dwuqdd5mt+7Zq5r37GMhFp1uk1AaCsE43KKYnk8onEiXJyIqW84hqIAYlQDD2RnlV9QpnA9Fr0yiy1THoiAxpdDhIzJdkcG1MUmb86fjcg34bbIq/MUsiMROUVP2fYGEDOhe1F50KUZeEhpwMwoYnEdJpYDEFZH40uEttpwD7xafGAeN+BYBuT8F89zdOKqEir5CK5RURjp5p7f5qEb16onvlnb/MELjriaSOjlDebe3419sMH0qyr2mZTvcKmpq9qnQbCZT1zaNvk0DojT1kgzu6zqXkagJd/cWh1a/vsRwBXDOai6a9OPDhP+V0n+bc6YK5TeqbypnqMX52IGojHxuQ0Ee8MrOh4yH5IWEEcZz0kapFmdWa1kSVCm1dcbyLuGSeJ2sR3Ou+ypLJ9B3PfwEHiGHssL7zdyljRg2EIu8FOP/fZNzjxT1oViOiyn95zQ86nm9ZxgzVGoBHGWDfwdi1hOqAX4m1QAj5J0+GmJri4dIe4BX2l/VFwUSEU9XgTxCoXRsFabS240yOklbiN9L04Yv3OvRVYGoTvX3H6rMXbTi6HCzNRDGJnydBN9EXJOA/Nm6yg4u2HMrbhWbB+8oLldr5xPbSgpOw7h4kwB+PY8rvDVEyEKRdG0RiwbIEeXoC/h4KZ0Xh0BEbT7cN87kxzHmQi9pB+ZqlvBATB7XT8CXGgJ5qBcIdgDjQpvEx95jAJo6AjbBbi7VzB59IYh1jEVrmhrcNhHncGRmD0EiA8Hi7jcQTcCJs7SxVqGZ4FCcAMNt+P6Y5BIB3fLiIDwOAsOoID20dzGYxNaDsIw806fBZm0P7B7vvFEFCDqALBPAuWJ+pS7SE7qgWOBuyfnGiuTwTL6uuXLVJdLcUhhPqqynp8aHFzbOTwCAnSp5NHTlMgPYhy8WZMTzNGhsl0PToQHhltbcxET2NbRsyG+Tk1OBj1YeeRI9msWZZq6bIU4tvHt7mUDav8W5PuvKucVb50aQphkv2WmOL1lbPesbIOHy4dTD0xlM0Czr7sqYPC1xYvLV68FtZZLoZEsibXh1+jXga95xQJf5aC+foYZNW5c6vAIWMEWUUpeX89nzYmD+7shPOAwxoqc00ext9foUgBY5xBQkOCdzoVji+viIcoVlTUdcQtUcWhoBb46BDSDLgAqlpxfFwQBGWkQ8YFDQgJSifgj0yBymWHH8N3m8vlzVlivPKF+WK1pV5fmPk3pQ8ha7J+e4zLYTk9Zo3LlYNZP5Tf/IvUPyw7ksx/NIixWePFTi4NgZX/RjiV3Pv06Ud6TOTxioRdtzWWmtvB+UGqLxGOGffR6J/pMT7Hb7YcniD8fTvw8A7aDd8b0rQ8gDgtZq1F4BYOmH9+Prb4KPSEs2Prja0c0+lreTP8mQJbirP1xtcmPOFAO+ozYNrWoumCJ1/5/K3jRw4OGFl+MWKQsWmTpZHUSNfTsGSYgpYMHDk0tpX/lf+koGh6K+Du0FvyovD9vMvfNn5qaMDGcp53Efvsg0Ga/n+F9hDDat5o4OTQ+Db+vMmTmuIXHRxgL/jYf3JJ5yDFfmLVFI8y2Nl4sv8bYmNr4xVAdnkOcWBwcIC4fA9XpbWrCvh9zyeB4KBYAEmoKcBhYsZW6rw5t68ntqfPQQTkciACYnmMCMrtC3HJwHv7ZQos4BjqCzcCyWOAGIjkchHIPRLm7GjuGcQX+omF17n7Lk3v5rR4GAyFxXU8JK4lPuwwDegb4nCeWCrGC6MQASzWE0PFemGVHCyWawu4OOsIBaab98R2KLE5Nk9MhwLDxVJihs9qNbArltJOp5Xzy02y+dm0UE2Wu1iBYaVicuEjm0cLJ1s8mxWYaYyiebQspahuqiy+3VNggnA9ONMOrq5l8KV1z0J03f+2sEzOMX830h5vJQHiAK5N9xAThipBFgea+7VBib1LuZoPMzpcwr1NwU5IbNonyZSarpmLssjZd42db50alGvxLe7yI1iK7OWY3mRdT4/cAfQl2lLsuzB+3ba5y0dXrqalF0jgxTXuwbQodk5dYxJFYRj4Yx+WqtinoJ5AnDGzNrMYyr0thqteHEwTKqhYIZbKfmSipCgrF/B/fKs2Xbuyp0vW0Ipf0FOhDem09LRp03WaP7hr7tiL7mSMfQEONSddjelCUFSzwUYlvGEDXFzxgIB0HlQMKd2LZxbBtTVQMrSotnZRG7ymFl4EJ9fUgB/NwaHmY+YZlukHSvJBAQjTgnSLDIuxX4LkZ+lu8EiIm7Mtsym1a70B6kA9wA4u5jnbhLjyukAdF6j2n4ktffPmdY9BT/Oy12WxZ5QlD++DymzR5Uu74+Bf37617XR5JQ7rEpMvz1TDchqkML9gCzmI37wuFDckRhh+oim2Jun/ac2nCeK3ZOk1YRKNC3IlsJow3zxJ1vK0Who2p5iusQokly6DAtBDd75+mfmxjR/H2iA1SsCFDTeHmhSVZUJChyWZWhabjrvTit/f1F+9qnpxiv+y2iBxaCnaO+BwI/nC0vV4oTmVk5HBqmCDODKyA6zY3rvcvPMQlU9ZdfwFP9RpsbwX+fbE9gnyDdgiBnOzVCT7l/4VQKv+r2yEOjvXqYo5acmnLn/C4+m3oIUjukWf94S3nMq3PIkxw7sIGbDAWJjEnq1hCp6ggFdfVmA2uCbiLKxuOL984hhPKG6K1eOdv0k3ivZPubeFSLIXGxcwQux7MwQ3l6BbqhfqiByChodyu1THUsP0pQvL8uMsJBME2IcgCY43XXLVpMZ70zMsmmggQwnTA91FilfLKsaY68wrTzRdtCgPPubD+c8znYU684095rx2pLe6iGZ0GMfZnP85n36y8NP+tYCDOLzcFd7dPs6F1u2cXmr7UYQLS8XYhXE+l1VedpAlXvBt6s5hJi8BocHfxsk+TpoAC1/DesNuKb/DiSwaxwWD0JQlOUy6p34xxrWjxXb3NLQedebnT9C8EfNo/9ndpwQehy6JhkAapHBa+qO4eVdL3DE4FNWvZesVd31p6+1tQxaNaH8kwH4j6S+SXRWIhVI8+usnoq7vQ5EegI2gi7QfwLFhvyRg7vqHO7EoGfm679TzgCHAp/5H36TdqmDj5p0Sg8AURjE4lhv5CqMjZGIBVlC9AYPuMmQfwgTpvxPgtWE2znZmNYU1aLAlVdFbwMif3LGUwyEZJmxAdOzDUEMGLYdPDyyNZxQa7qGdAJWsKugYtAGToBtfyQ6rQUivL//fi+afdwXp5YhZgyuqC0+T19I8t5lUFWlPcGIIsOGxaSsoNghvffgY37D1LFwH9WufBv0EcB19+oaznlXnqU4rPWwmM5ZmeKXgWK0RbkvHjo4tOKO6oYIrhjRWrHzzAoYpdJJ1FTKj6CKjfrA4zEzdH8SHXRSbSZsVrmw9D3AVPgW52zmnuMy8XHrZMgP9YaG/6jU/tsUk0nzafhD2QvrsAk+iFNQlx1qI0tidjBasBQmQJqsJiDzvrNa5xLDlyYQbDy+HXIEf7pgLI5YyD9o1JeiYaTTfCFn4kdt6xVnYetpmdP7tPo/qVeclpMfHnC4830+eox+h62uPjsXufBpiys5AG54na330Xhkix2bjxuj4bAR/o5UQ6tTTqFj8GPOGf14/ydzEabc98MOiBZP9vsnGduXLd8fnL1X2/YUmXb+FoaSA+bqtQFkwckH54EI7BSiRwVevBpH7zIFMUYpubCSum9KNi8R2V3tie7BXU6S0Nea2J2psK3Z4FSk9SHcXibPo1tNbCz0wVzFtwABRq4H6rDeADK7mdeLdGZh/UVkyFZCUBueLDH2e9urf6Qfi3LZ2iUQ6vBmA2uoWvM1Xa+F5uD2C6wGoqw0gLoJW0w2Rg/5F0iJ3jSBW1m1mkIz5P04XtSmfLrED1kS6nEBy1TpkiAefTWlxRG0NoqavIQj9TeatWvUSAhHSyKJqnIVsvLABMaClxbAoRUWRAXeQRf07h8+ReLelcBcANWEQEUTKMn9EQsztZz79pkOIrSvUeqQdwpljjqbPUSdqH3yXpe1cUdIAvCJVu+GvmHr/R5SR/7qXiJm60slY/ewc5sgOX5CayDsDCF1Vd0UqIsMNIHH4GEaS4koC0yKnaBA/46cWhASdEsOkcoRCI4Xz3wMagN+ztmGYe30VAIkq+rpQ7xP8HiNNiNxyDrGh/yVWPCQ4jpxvEOLzvFeFIR4A1PQowhFBRkilU/BpAOqJBsQYe0dnVgeygNYrQozwFA9K1ceaWACIz73xv9WIIU/n4t7zsNx4SoPo87Z7qk9tZknft1uEsI2wIiO/nUMgddIy0XiaFcX4bJHgA5Xcup+KQ7wBqEfdTMLQyG9W9TjC4SUneNTLqnwbCyX1nFPY1bM0vNxXjCIEn5M7EAAKzQGoey5iziRGXV+UGIafiyCFoRm5Q4NYxEdCiQl5YTsEYRd2ckKUoA5lsoyoZ5VASE/rhJw+Cx/vm4iWnpLrYpKL4Y3PbMEWDXFFA2/BLBlPuDlICI1V2MLDkv4zXBFpm1M2cUHF8GPfsUl62lbRqga+lAhNryvIUtcY32xGcH0wvRnRchFZhyFdi3jdk8sQicrH6gNbXN15Pko2JUZCjMhDUnlmh6hsPXUMgnrTeZoyxVtEUdIAzIGW/ht+1beFm77QnwJQt1XQNuOVyMo+ASGQsyHYq0AM1F4f+1TkOg3icG1f9xBRhF4Mu2D8XyIcGDi91mqdQvX4XCV7UQHwHduPiDb/XZWvX4oFqoOfjRfAf4AgVoudUT8Hl7Fs5IvK/HbYfUgO/P/P986utoznzZZob/f8XNxd/vUKCwT51Z3/3qrOmW+pN675T0MSSgH4ophggxKg5mYB8B9CbGjo5xBHDOxVLuDGbDxQgmU4UIZjQlc6rQeqIHIYqArHe6AmK9Puvhamg8qgSg1AT1eiAQjN1wMwirMDCJpvaFTnTwNoWv4awKAVBgjkBfNeEL3lh4IaOCEUdIduPVAv7IVLc9r2bwwaIa1jpO9/TJk2H1obweN1PyBjEuGTX8NLKf7gk0yH76P9wxjlMCcZsS9PQynz18+2WbQGnnqZ3jTfJISC7qBbDy9MvbB/76XJ/eT/xqARUsF2Fy/8P6ZMX/1B68lHBvoHwkzbhWLPr+FFSWR/2OlJprPwfSpj3BhyMNMrjdiXJwOHPn/tOdmZZyVP6oXpVSxpfXNmIYWoA6SISVNFhiwJOarpAwPmLx8vFQBEmFD2h4Xvu1xIpY11PsQkzfKirOqm7fphnOZl3fbjvO7n/X4QghEU+/m3PEl924oPy/GCKMl/4yyv1vy8X4HeYPwMxTqzWG12h9Pl9nh9/kAwFI5EY/FEMpXOZHP5QrFUrlRr9Uaz9YM/j4N2p9vrD4aj8WQ6my+Wq/Vmu9sfjqfz5Xq7P56v9+f7+5sgO2dJlF0fJWNdaEJPMV7mFXDuJvyuz/mTaihT/OzdJ5uyDcBhJGwvZwrEz7rBMW6/mrzmizNSRyCF2hc1O2/zQCMBmzzgNlC9EGxA7Zcc6az1PMxHIA/Ga4nFq0isizkjDyB2UxFiNbjMwE4eJbC6V1tFXUVrR8Ab8Fn0Shnax79e22TgkUAW4vCo821UycmZd4F8McvKspuAYt0BfeaEOV86oAlmJFF6MoWypP18z1h26Ki8zyrWoQeNxSLI2H7AWjLvTqdaz6AnAr5ykAcdtVfuBzVTLijxtizlkYDVzmFV4LqkdT5ErE6KXHZ9dvz+/z9/f1+Cr+w3ItZaUrtntwfhYDOwG1t2HWS0JQ5iIX65+qdAf/zjFZOPcrbQ1S+ND/CjK5H4EGY8KabVOOmPmMy8ljl+7/xMsxI3JQRuryPxER1xVQQV7az7f/76NWMSjq8E8FHnQo+80F2uAPE5ARedCbi9/QQ9RP1pHi7DR+HwQCVPj5EUvkWBI5mKUET31RmSrY8YhYOxJqmsrzSFGmupkaLWiwJvWMh0muCGReIglb84QMXFjkDsQkDJDZXPkgpnoEXtmKQjWTb9ciXuc1M7WoHNEcifSCdIfqN1B9whH7WinBVvkVUzPc7E4abMFDa4JFYO16fTBmc/4I0WZYvpjDSBEqRW9FCbQberqNZ8MhtjhW3yIDrSLXLp2IozaMB1yB55yVuZMBYuCf9YT3G1qazYhKdLr3JWs9GqNCY3vA+xG9sgHAKI7RrCJWFqsNx74EFHCCUhtw/VrYfsF8h01eQBlZJVjEb2R2bJRbRmXsv47SNpBF6B7UgcSPzaPjiORAfGsdX7ggKf9myyaFbZeej0qlMkPTChKiKH/cRKTjDv1tPsA2+4Ux1dSVoRFtpBfQlKvJEZlLy2tt0W2m0APkLDM6o2NZuK1l3NGr2Qy7qjy/htgBU4oA7JDMV0Aipbn4HtyTctl6jbtYtZy4q5MvKQnc4rIBG170wHbPUlRTqhghv2QA74pmHYziBY8+c1hu9wafRvwQbk4FSqhBnL3aLIh8583csyC3FQgYhQe2c01FyZ9rqXuiSNSrbGh20gRsSoolJokSfylmdCZ+gGa7RxJ+1GeIXaYkci7LykYzWt+RRNoDJoV0/CQVzX2pI0F+o5H0aLshWFawM1BzIMk28AAA==') format('woff2'), - url('iconfont.woff?t=1559184647273') format('woff'), - url('iconfont.ttf?t=1559184647273') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ - url('iconfont.svg?t=1559184647273#iconfont') format('svg'); /* iOS 4.1- */ + src: url('iconfont.eot?t=1560325865877'); /* IE9 */ + src: url('iconfont.eot?t=1560325865877#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1560325865877') format('woff'), + url('iconfont.ttf?t=1560325865877') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1560325865877#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { diff --git a/public/react/src/modules/page/VNCDisplay.js b/public/react/src/modules/page/VNCDisplay.js index e6dff2f4..1e443ed1 100644 --- a/public/react/src/modules/page/VNCDisplay.js +++ b/public/react/src/modules/page/VNCDisplay.js @@ -88,11 +88,11 @@ class VNCDisplay extends Component { status("Connecting"); // Build the websocket URL used to connect let url; - // if (window.location.protocol === "https:") { - // url = 'wss'; - // } else { + if (vnc_url.indexOf("https:") != -1) { + url = 'wss'; + } else { url = 'ws'; - // } + } url += '://' + host; if(port) { url += ':' + port; diff --git a/public/stylesheets/educoder/trainings.css b/public/stylesheets/educoder/trainings.css index 0ac9ae6d..ad5cdcb6 100644 --- a/public/stylesheets/educoder/trainings.css +++ b/public/stylesheets/educoder/trainings.css @@ -20,12 +20,13 @@ a{text-decoration: none} .flex1{flex: 1} li{list-style-type: none;} - +.color-orange{color: #FC682D!important;} .mb5{margin-bottom: 5px}.mb10{margin-bottom: 10px!important;} + .mt5{margin-top: 5px} .mr5{margin-right: 5px} -.ml10{margin-left: 10px;} +.ml5{margin-left: 5px;}.ml10{margin-left: 10px;} .mr10{margin-right: 10px;} .line20{line-height: 20px;} @@ -120,8 +121,15 @@ input::-ms-input-placeholder,textarea::-ms-input-placeholder {color:#cccccc;} span.left_tag{font-weight:bold; } input[type='text'].right_input{ float: right;border: none;text-align: right;height: 44px;line-height: 44px;outline: none; - font-size: 1.4rem;width: 70%;margin-right: 24px; + font-size: 1.4rem;width: 70%;/*margin-right: 24px;*/ +} +.PositionalRight .magic-radio + label:before,.PositionalRight .magic-checkbox + label:before{ + top:13px!important; +} +.PositionalRight .magic-radio + label:after{ + top: 18px!important; } +.mr15{margin-right: 15px;} .infoBar label.right_tag{ float: right;color: #cccccc;font-size: 1.4rem;margin-right: 24px; } @@ -167,7 +175,7 @@ input[type='text'].right_input{ float: right;color: #333; } .bottomBtn{ - position: fixed;bottom: 0px;left: 0px;width: 100%;height: 44px;line-height: 44px;font-size: 1.6rem;text-align: center; + position: fixed;bottom: 0px;left: 0px;width: 100%;height: 44px;line-height: 44px;font-size: 1.6rem;text-align: center;z-index: 20; } .bottomBtn .leftbtn{ width: 50%;float: left;background-color: #fff;color: #676767; @@ -195,7 +203,7 @@ input[type='text'].right_input{ line-height: 20px;margin-top: 3px; } .remarkAccount{ - width: 100%;resize: none;height: 80px;margin-bottom:14px;border: 1px solid #eee;padding: 5px;box-sizing: border-box; + width: 100%;resize: none;height: 80px;border: 1px solid #eee;padding: 5px;box-sizing: border-box;margin-bottom: 1rem; } .moneyDetail{ line-height: 20px;color: #4B4B4B; @@ -233,6 +241,7 @@ input[type='text'].right_input{ .billInput.nullVal{border:1px solid #DD1717;} .meetInfo{color: #4CACFF;} .enrollNum{margin:10px 15px;font-size: 1.4rem;} +.lastPrice{color: #bfbfbf;font-size: 0.8em;text-decoration: line-through;margin-left: 5px;margin-top: 2px;} /*上传图片*/ .weui-uploader__bd {position: relative;width: 100px;height: 100px;} .weui-uploader__files {list-style: none;} @@ -256,3 +265,38 @@ input[type='text'].right_input{ content: " ";position: absolute;top: 50%;left: 50%;-webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%);background-color: #D9D9D9; } + + +/* 支付信息 */ +.InfoTop{width: 100%;height: 6.5rem;background: linear-gradient(to right, #4CC6FF , #6588F8);justify-content: center; + align-items: center;display: -webkit-flex;font-size: 1.6rem;color: white;} + .info_updateBtn{ + display: block; + width: 60%; + height: 35px; + line-height: 35px; + text-align: center; + border: 1px solid #4CC6FF; + border-radius: 24px; + font-size: 1.6rem; + color: #4CC6FF!important; + margin-top: 1rem;margin:2rem auto; + } + .Infos{ + padding:15px;box-sizing: border-box;background: #fff; + } + .Infos {margin-bottom: 1rem;} + .Infos .Infos_title{font-size: 1.5rem;color: #000;margin-bottom: 1rem;} + .Infos li{margin-bottom: 8px;} + .Infos li span:first-child{color: #666666;font-size: 1.4rem;float: left;} + .Infos li span:last-child{color: #333;font-size: 1.4rem;float: right;} + .Infos .Infos_tag{float: left;height:2.0rem;padding: 0px 0.5rem;box-sizing: border-box;line-height: 2.0rem; + background: #E6F3FF;color: #4CACFF;cursor: default;margin-right: 1.5rem;margin-bottom: 1.0rem; + } + .Infos_btn {background: #fff;height: 5rem;line-height: 5rem;position: absolute;bottom: 0px;left:0px;width: 100%;} + .Infos_btn a{ + float: left;width: 50%;text-align: center;color: #4CACFF!important;font-size: 1.8rem; + } + .Infos_btn a:last-child{ + background: #4CACFF!important;color: #fff!important; + }