URI: 
       Updating all files to Ruby 1.9 hash syntax - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit 7748223da0e7688d2db2ef51c03b835ad21e25ff
   DIR parent df11fd7842f74b579d73011c15cd87a3d27e4e4c
  HTML Author: Jay Scott <jay@beardyjay.co.uk>
       Date:   Mon,  5 Sep 2016 10:39:14 +0000
       
       Updating all files to Ruby 1.9 hash syntax
       
       Diffstat:
         D Dockerfile                          |      27 ---------------------------
         M app/controllers/analyze_controller… |      22 +++++++++++-----------
         M app/controllers/application_contro… |       4 ++--
         M app/controllers/home_controller.rb  |       6 +++---
         M app/controllers/jobs_controller.rb  |      10 +++++-----
         M app/controllers/projects_controlle… |      40 ++++++++++++++++----------------
         M app/controllers/providers_controll… |      18 +++++++++---------
         M app/controllers/user_sessions_cont… |       6 +++---
         M app/controllers/users_controller.rb |       8 ++++----
         M app/helpers/application_helper.rb   |      14 +++++++-------
         M app/models/call.rb                  |      20 ++++++++++----------
         M app/models/job.rb                   |      42 ++++++++++++++++----------------
         M app/models/line.rb                  |       4 ++--
         M app/models/project.rb               |      10 +++++-----
         M app/models/provider.rb              |       4 ++--
         M app/models/user.rb                  |       4 ++--
         M bin/adduser                         |       2 +-
         M bin/export_audio.rb                 |       2 +-
         M bin/export_list.rb                  |       2 +-
         M bin/iaxrecord.rb                    |       2 +-
         M bin/import_audio.rb                 |      24 ++++++++++++------------
         M bin/resetpw                         |       2 +-
         M bin/worker_manager.rb               |      10 +++++-----
         M config/routes.rb                    |       2 +-
         M db/migrate/20121228171549_initial_… |      84 ++++++++++++++++----------------
         M db/migrate/20130113004653_create_r… |      24 ++++++++++++------------
         M lib/warvox/audio/raw.rb             |       2 +-
         M lib/warvox/jobs/analysis.rb         |      32 ++++++++++++++++----------------
         M lib/warvox/jobs/dialer.rb           |      16 ++++++++--------
         M lib/warvox/proto/iax2/client.rb     |       8 ++++----
         M spec/factories/settings.rb          |       2 +-
       
       31 files changed, 213 insertions(+), 240 deletions(-)
       ---
   DIR diff --git a/Dockerfile b/Dockerfile
       @@ -1,27 +0,0 @@
       -FROM ruby:slim
       -MAINTAINER Jay Scott <jay@beardyjay.co.uk>
       -
       -RUN apt-get update && apt-get -y install \
       -  gnuplot \
       -  lame \
       -  build-essential \
       -  libssl-dev \
       -  libcurl4-openssl-dev \ 
       -  postgresql-contrib \
       -  git-core \
       -  curl \
       -  libpq-dev \
       -  sox \
       -  && rm -rf /var/lib/apt/lists/*
       -
       -ADD . /opt/warvox
       -ADD setup.sh /
       -
       -WORKDIR /opt/warvox
       -RUN ln -s /usr/bin/ruby2.1 /usr/bin/ruby \
       -    && bundle install \
       -    && make
       -
       -EXPOSE 7777
       -
       -CMD ["/setup.sh"]
   DIR diff --git a/app/controllers/analyze_controller.rb b/app/controllers/analyze_controller.rb
       @@ -2,8 +2,8 @@ class AnalyzeController < ApplicationController
        
          def index
            @jobs = Job.order('id DESC').paginate(
       -      :page => params[:page],
       -      :per_page => 30
       +      page: params[:page],
       +      per_page: 30
            )
          end
        
       @@ -13,12 +13,12 @@ class AnalyzeController < ApplicationController
            @shown    = params[:show]
        
            if request.format.html?
       -      ltypes = Call.select('DISTINCT line_type').where(:job_id => @job_id).map{|r| r.line_type}
       +      ltypes = Call.select('DISTINCT line_type').where(job_id: @job_id).map{|r| r.line_type}
              res_types = {}
        
              ltypes.each do |k|
                next if not k
       -        res_types[k.capitalize.to_sym] = Call.where(:job_id => @job_id, :line_type => k).count
       +        res_types[k.capitalize.to_sym] = Call.where(job_id: @job_id, line_type: k).count
              end
        
              @lines_by_type = res_types
       @@ -51,7 +51,7 @@ class AnalyzeController < ApplicationController
            respond_to do |format|
              format.html
              format.json {
       -        render :content_type => 'application/json', :json => render_to_string(:partial => 'view', :results => @results, :lines_by_type => @lines_by_type )
       +        render content_type: 'application/json', json: render_to_string(partial: 'view', results: @results, lines_by_type: @lines_by_type )
              }
            end
        
       @@ -60,9 +60,9 @@ class AnalyzeController < ApplicationController
          def view_matches
            @result = Call.find(params[:call_id])
            @match_scopes = [
       -      { :scope => 'job', :label => 'This Job' },
       -      { :scope => 'project', :label => 'This Project' },
       -      { :scope => 'global', :label => 'All Projects' }
       +      { scope: 'job', label: 'This Job' },
       +      { scope: 'project', label: 'This Project' },
       +      { scope: 'global', label: 'All Projects' }
            ]
        
            @job_id = params[:job_id]
       @@ -111,7 +111,7 @@ class AnalyzeController < ApplicationController
            respond_to do |format|
              format.html
              format.json {
       -        render :content_type => 'application/json', :json => render_to_string(:partial => 'index', :results => @results, :lines_by_type => @lines_by_type )
       +        render content_type: 'application/json', json: render_to_string(partial: 'index', results: @results, lines_by_type: @lines_by_type )
              }
            end
        
       @@ -122,7 +122,7 @@ class AnalyzeController < ApplicationController
            cpath = nil
            cdata = "File not found"
        
       -    res = CallMedium.where(:call_id => params[:result_id].to_i).first
       +    res = CallMedium.where(call_id: params[:result_id].to_i).first
        
            if res
              case params[:rtype]
       @@ -153,7 +153,7 @@ class AnalyzeController < ApplicationController
              end
            end
        
       -    send_data(cdata, :type => ctype, :disposition => 'inline')
       +    send_data(cdata, type: ctype, disposition: 'inline')
          end
        
          #
   DIR diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
       @@ -52,9 +52,9 @@ private
            return true unless current_user
        
            if params[:project_id]
       -      @project = Project.where(:id => params[:project_id].to_i).first
       +      @project = Project.where(id: params[:project_id].to_i).first
            elsif session[:project_id]
       -      @project = Project.where(:id => session[:project_id].to_i).first
       +      @project = Project.where(id: session[:project_id].to_i).first
            end
        
            if @project and @project.id and not (session[:project_id] and session[:project_id] == @project.id)
   DIR diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
       @@ -18,9 +18,9 @@ class HomeController < ApplicationController
        
          def check
            @has_project  = ( Project.count > 0 )
       -    @has_provider = ( Provider.where(:enabled => true).count > 0 )
       -    @has_job      = ( Job.where(:task => 'dialer').count > 0 )
       -    @has_result   = ( Call.where(:answered => true ).count > 0 )
       +    @has_provider = ( Provider.where(enabled: true).count > 0 )
       +    @has_job      = ( Job.where(task: 'dialer').count > 0 )
       +    @has_result   = ( Call.where(answered: true ).count > 0 )
            @has_analysis = ( Call.where('analysis_completed_at IS NOT NULL').count > 0 )
          end
        
   DIR diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb
       @@ -35,9 +35,9 @@ class JobsController < ApplicationController
            @job = Job.find(params[:id])
        
            @call_results = {
       -      :Timeout  => @job.calls.where(:answered => false ).count,
       -      :Busy     => @job.calls.where(:busy     => true).count,
       -      :Answered => @job.calls.where(:answered => true).count,
       +      Timeout: @job.calls.where(answered: false ).count,
       +      Busy: @job.calls.where(busy: true).count,
       +      Answered: @job.calls.where(answered: true).count,
            }
        
        
       @@ -145,8 +145,8 @@ class JobsController < ApplicationController
        
          def purge_calls
            unless params[:result_ids].blank?
       -      Call.delete_all(:id => params[:result_ids])
       -      CallMedium.delete_all(:call_id => params[:result_ids])
       +      Call.delete_all(id: params[:result_ids])
       +      CallMedium.delete_all(call_id: params[:result_ids])
              flash[:notice] = "Purged #{params[:result_ids].length} calls"
            end
        
   DIR diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
       @@ -2,34 +2,34 @@ class ProjectsController < ApplicationController
        
          def index
             @projects = Project.order('id DESC').paginate(
       -      :page => params[:page],
       -      :per_page => 10
       +      page: params[:page],
       +      per_page: 10
            )
        
            @new_project = Project.new
        
            respond_to do |format|
              format.html
       -      format.xml  { render :xml => @projects }
       +      format.xml  { render xml: @projects }
            end
          end
        
          def show
            @project = Project.find(params[:id])
       -    @active_jobs = @project.jobs.where(:status => 'running', :completed_at => nil)
       +    @active_jobs = @project.jobs.where(status: 'running', completed_at: nil)
            @inactive_jobs  = @project.jobs.order('id DESC').where('status NOT IN (?)', ['submitted', 'scheduled', 'running']).paginate(
       -      :page => params[:page],
       -      :per_page => 30
       +      page: params[:page],
       +      per_page: 30
            )
        
            @boxes = {
       -      :called    => { :cnt => @project.calls.count },
       -      :answered  => { :cnt => @project.calls.where(:answered => true).count },
       -      :analyzed  => { :cnt => @project.calls.where('analysis_completed_at IS NOT NULL').count },
       -      :voice     => { :cnt => @project.lines.where(:line_type => 'voice').count },
       -      :voicemail => { :cnt => @project.lines.where(:line_type => 'voicemail').count },
       -      :fax       => { :cnt => @project.lines.where(:line_type => 'fax').count },
       -      :modem     => { :cnt => @project.lines.where(:line_type => 'modem').count }
       +      called: { cnt: @project.calls.count },
       +      answered: { cnt: @project.calls.where(answered: true).count },
       +      analyzed: { cnt: @project.calls.where('analysis_completed_at IS NOT NULL').count },
       +      voice: { cnt: @project.lines.where(line_type: 'voice').count },
       +      voicemail: { cnt: @project.lines.where(line_type: 'voicemail').count },
       +      fax: { cnt: @project.lines.where(line_type: 'fax').count },
       +      modem: { cnt: @project.lines.where(line_type: 'modem').count }
            }
        
            if @boxes[:called][:cnt] == 0
       @@ -78,7 +78,7 @@ class ProjectsController < ApplicationController
        
            respond_to do |format|
              format.html
       -      format.xml  { render :xml => @project }
       +      format.xml  { render xml: @project }
            end
          end
        
       @@ -86,7 +86,7 @@ class ProjectsController < ApplicationController
            @new_project = Project.new
            respond_to do |format|
              format.html
       -      format.xml  { render :xml => @new_project }
       +      format.xml  { render xml: @new_project }
            end
          end
        
       @@ -102,10 +102,10 @@ class ProjectsController < ApplicationController
            respond_to do |format|
              if @new_project.save
                format.html { redirect_to(project_path(@new_project)) }
       -        format.xml  { render :xml => @project, :status => :created, :location => @new_project }
       +        format.xml  { render xml: @project, status: :created, location: @new_project }
              else
       -        format.html { render :action => "new" }
       -        format.xml  { render :xml => @new_project.errors, :status => :unprocessable_entity }
       +        format.html { render action: "new" }
       +        format.xml  { render xml: @new_project.errors, status: :unprocessable_entity }
              end
            end
          end
       @@ -118,8 +118,8 @@ class ProjectsController < ApplicationController
                format.html { redirect_to projects_path }
                format.xml  { head :ok }
              else
       -        format.html { render :action => "edit" }
       -        format.xml  { render :xml => @project.errors, :status => :unprocessable_entity }
       +        format.html { render action: "edit" }
       +        format.xml  { render xml: @project.errors, status: :unprocessable_entity }
              end
            end
          end
   DIR diff --git a/app/controllers/providers_controller.rb b/app/controllers/providers_controller.rb
       @@ -3,8 +3,8 @@ class ProvidersController < ApplicationController
          def index
        
             @providers = Provider.order('id DESC').paginate(
       -    :page => params[:page],
       -    :per_page => 10
       +    page: params[:page],
       +    per_page: 10
          )
        
          @new_provider = Provider.new
       @@ -12,7 +12,7 @@ class ProvidersController < ApplicationController
        
            respond_to do |format|
              format.html # index.html.erb
       -      format.xml  { render :xml => @providers }
       +      format.xml  { render xml: @providers }
            end
          end
        
       @@ -23,7 +23,7 @@ class ProvidersController < ApplicationController
        
            respond_to do |format|
              format.html # new.html.erb
       -      format.xml  { render :xml => @provider }
       +      format.xml  { render xml: @provider }
            end
          end
        
       @@ -40,10 +40,10 @@ class ProvidersController < ApplicationController
              if @provider.save
                flash[:notice] = 'Provider was successfully created.'
                format.html { redirect_to providers_path }
       -        format.xml  { render :xml => @provider, :status => :created, :location => providers_path }
       +        format.xml  { render xml: @provider, status: :created, location: providers_path }
              else
       -        format.html { render :action => "new" }
       -        format.xml  { render :xml => @provider.errors, :status => :unprocessable_entity }
       +        format.html { render action: "new" }
       +        format.xml  { render xml: @provider.errors, status: :unprocessable_entity }
              end
            end
          end
       @@ -63,8 +63,8 @@ class ProvidersController < ApplicationController
                format.html { redirect_to providers_path }
                format.xml  { head :ok }
              else
       -        format.html { render :action => "edit" }
       -        format.xml  { render :xml => @provider.errors, :status => :unprocessable_entity }
       +        format.html { render action: "edit" }
       +        format.xml  { render xml: @provider.errors, status: :unprocessable_entity }
              end
            end
          end
   DIR diff --git a/app/controllers/user_sessions_controller.rb b/app/controllers/user_sessions_controller.rb
       @@ -1,6 +1,6 @@
        class UserSessionsController < ApplicationController
       -  before_action :require_no_user, :only => [:new, :create]
       -  before_action :require_user, :only => :destroy
       +  before_action :require_no_user, only: [:new, :create]
       +  before_action :require_user, only: :destroy
          layout 'login'
        
          def new
       @@ -12,7 +12,7 @@ class UserSessionsController < ApplicationController
            if @user_session.save
              redirect_back_or_default projects_path
            else
       -      render :action => :new
       +      render action: :new
            end
          end
        
   DIR diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
       @@ -1,6 +1,6 @@
        class UsersController < ApplicationController
       -  before_action :require_no_user, :only => [:new, :create]
       -  before_action :require_user, :only => [:show, :edit, :update]
       +  before_action :require_no_user, only: [:new, :create]
       +  before_action :require_user, only: [:show, :edit, :update]
        
          def new
            @user = User.new
       @@ -12,7 +12,7 @@ class UsersController < ApplicationController
              flash[:notice] = "Account registered!"
              redirect_back_or_default user_path(@user)
            else
       -      render :action => :new
       +      render action: :new
            end
          end
        
       @@ -30,7 +30,7 @@ class UsersController < ApplicationController
              flash[:notice] = "Account updated!"
              redirect_to user_path(@user)
            else
       -      render :action => :edit
       +      render action: :edit
            end
          end
        
   DIR diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
       @@ -2,7 +2,7 @@
        module ApplicationHelper
        
          def select_tag_for_filter(nvpairs, params)
       -    _url = ( url_for :overwrite_params => { }).split('?')[0]
       +    _url = ( url_for overwrite_params: { }).split('?')[0]
            _html = %{<span class="pull-left filter-label">Filter: </span> }
            _html << %{<select name="show" class="filter-select" }
            _html << %{onchange="window.location='#{_url}' + '?show=' + this.value"> }
       @@ -19,7 +19,7 @@ module ApplicationHelper
          end
        
          def select_match_scope(nvpairs, params)
       -    _url = ( url_for :overwrite_params => { }).split('?')[0]
       +    _url = ( url_for overwrite_params: { }).split('?')[0]
            _html = %{<span class="pull-left filter-label">Matching Scope: </span> }
            _html << %{<select name="match_scope" class="filter-select" }
            _html << %{onchange="window.location='#{_url}' + '?match_scope=' + this.value"> }
       @@ -45,8 +45,8 @@ module ApplicationHelper
        
              ttip = raw("<div class='task_args_formatted'>")
              info.each_pair do |k,v|
       -        ttip << raw("<div class='task_args_var'>") + h(truncate(k.to_s, :length => 20)) + raw(": </div> ")
       -        ttip << raw("<div class='task_args_val'>") + h(truncate((v.to_s), :length => 20)) + raw("&nbsp;</div>")
       +        ttip << raw("<div class='task_args_var'>") + h(truncate(k.to_s, length: 20)) + raw(": </div> ")
       +        ttip << raw("<div class='task_args_val'>") + h(truncate((v.to_s), length: 20)) + raw("&nbsp;</div>")
              end
              ttip << raw("</div>\n")
              outp = raw("<span class='xpopover' rel='popover' data-title=\"#{job.task.capitalize} Task ##{job.id}\" data-content=\"#{ttip}\">#{h job.task.capitalize}</span>")
       @@ -120,9 +120,9 @@ module ApplicationHelper
          def submit_checkboxes_to(name, path, html={})
            if html[:confirm]
              confirm = html.delete(:confirm)
       -      link_to(name, "#", html.merge({:onclick => "if(confirm('#{h confirm}')){ submit_checkboxes_to('#{path}','#{form_authenticity_token}')}else{return false;}" }))
       +      link_to(name, "#", html.merge({onclick: "if(confirm('#{h confirm}')){ submit_checkboxes_to('#{path}','#{form_authenticity_token}')}else{return false;}" }))
            else
       -      link_to(name, "#", html.merge({:onclick => "submit_checkboxes_to('#{path}','#{form_authenticity_token}')" }))
       +      link_to(name, "#", html.merge({onclick: "submit_checkboxes_to('#{path}','#{form_authenticity_token}')" }))
            end
          end
        
       @@ -143,7 +143,7 @@ module ApplicationHelper
          # Generate the markup for the call's row checkbox.
          # Returns the String markup html, escaped for json.
          def call_checkbox_tag(call)
       -    check_box_tag("result_ids[]", call.id, false, :id => nil).to_json.html_safe
       +    check_box_tag("result_ids[]", call.id, false, id: nil).to_json.html_safe
          end
        
          def call_number_html(call)
   DIR diff --git a/app/models/call.rb b/app/models/call.rb
       @@ -26,20 +26,20 @@
        
        class Call < ApplicationRecord
        
       -  reportable :hourly, :aggregation => :count, :grouping => :hour, :live_data => true, :cacheable => false, :limit => 24
       -  reportable :daily, :aggregation => :count, :grouping => :day, :live_data => true, :cacheable => false, :limit => 7
       -  reportable :weekly, :aggregation => :count, :grouping => :week, :live_data => true, :cacheable => false, :limit => 52
       -  reportable :monthly, :aggregation => :count, :grouping => :month, :live_data => true, :cacheable => false, :limit => 12
       +  reportable :hourly, aggregation: :count, grouping: :hour, live_data: true, cacheable: false, limit: 24
       +  reportable :daily, aggregation: :count, grouping: :day, live_data: true, cacheable: false, limit: 7
       +  reportable :weekly, aggregation: :count, grouping: :week, live_data: true, cacheable: false, limit: 52
       +  reportable :monthly, aggregation: :count, grouping: :month, live_data: true, cacheable: false, limit: 12
        
       -  reportable :analyzed_hourly, :aggregation => :count, :grouping => :hour, :date_column => :analysis_completed_at, :live_data => true, :cacheable => false, :limit => 24
       -  reportable :analyzed_daily, :aggregation => :count, :grouping => :day, :date_column => :analysis_completed_at, :live_data => true, :cacheable => false, :limit => 7
       -  reportable :analyzed_weekly, :aggregation => :count, :grouping => :week, :date_column => :analysis_completed_at, :live_data => true, :cacheable => false, :limit => 52
       -  reportable :analyzed_monthly, :aggregation => :count, :grouping => :month, :date_column => :analysis_completed_at, :live_data => true, :cacheable => false, :limit => 12
       +  reportable :analyzed_hourly, aggregation: :count, grouping: :hour, date_column: :analysis_completed_at, live_data: true, cacheable: false, limit: 24
       +  reportable :analyzed_daily, aggregation: :count, grouping: :day, date_column: :analysis_completed_at, live_data: true, cacheable: false, limit: 7
       +  reportable :analyzed_weekly, aggregation: :count, grouping: :week, date_column: :analysis_completed_at, live_data: true, cacheable: false, limit: 52
       +  reportable :analyzed_monthly, aggregation: :count, grouping: :month, date_column: :analysis_completed_at, live_data: true, cacheable: false, limit: 12
        
          belongs_to :project
          belongs_to :provider
          belongs_to :job
       -  has_one :call_medium, :dependent => :delete
       +  has_one :call_medium, dependent: :delete
        
          def matches
            #    "AND (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::int[] & calls.fprint::int[]) / icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}'::int[])::float ) * 100.0 ) > 10.0 " +
       @@ -103,7 +103,7 @@ class Call < ApplicationRecord
            args << min_match.to_f
        
            query = [match_sql, *args]
       -    Call.paginate_by_sql(query, :page => page, :per_page => per_page)
       +    Call.paginate_by_sql(query, page: page, per_page: per_page)
          end
        
          def media
   DIR diff --git a/app/models/job.rb b/app/models/job.rb
       @@ -20,10 +20,10 @@
        
        class Job < ApplicationRecord
        
       -  reportable :hourly, :aggregation => :count, :grouping => :hour, :date_column => :created_at, :cacheable => false
       -  reportable :daily, :aggregation => :count, :grouping => :day, :date_column => :created_at, :cacheable => false
       -  reportable :weeky, :aggregation => :count, :grouping => :week, :date_column => :created_at, :cacheable => false
       -  reportable :monthly, :aggregation => :count, :grouping => :month, :date_column => :created_at, :cacheable => false
       +  reportable :hourly, aggregation: :count, grouping: :hour, date_column: :created_at, cacheable: false
       +  reportable :daily, aggregation: :count, grouping: :day, date_column: :created_at, cacheable: false
       +  reportable :weeky, aggregation: :count, grouping: :week, date_column: :created_at, cacheable: false
       +  reportable :monthly, aggregation: :count, grouping: :month, date_column: :created_at, cacheable: false
        
          class JobValidator < ActiveModel::Validator
            def validate(record)
       @@ -54,10 +54,10 @@ class Job < ApplicationRecord
                unless ['calls', 'job', 'project', 'global'].include?(record.scope)
                  record.errors[:scope] << "Scope must be calls, job, project, or global"
                end
       -        if record.scope == "job" and Job.where(:id => record.target_id.to_i, :task => ['import', 'dialer']).count == 0
       +        if record.scope == "job" and Job.where(id: record.target_id.to_i, task: ['import', 'dialer']).count == 0
                  record.errors[:job_id] << "The job_id is not valid"
                end
       -        if record.scope == "project" and Project.where(:id => record.target_id.to_i).count == 0
       +        if record.scope == "project" and Project.where(id: record.target_id.to_i).count == 0
                  record.errors[:project_id] << "The project_id is not valid"
                end
                if record.scope == "calls" and (record.target_ids.nil? or record.target_ids.length == 0)
       @@ -71,7 +71,7 @@ class Job < ApplicationRecord
          end
        
          # XXX: Purging a single job will be slow, but deleting the project is fast
       -  has_many :calls, :dependent => :destroy
       +  has_many :calls, dependent: :destroy
        
          belongs_to :project
        
       @@ -97,9 +97,9 @@ class Job < ApplicationRecord
        
          def update_progress(pct)
            if pct >= 100
       -      self.class.where(id: self.id).update_all(:progress => pct, :completed_at => Time.now, :status => 'completed')
       +      self.class.where(id: self.id).update_all(progress: pct, completed_at: Time.now, status: 'completed')
            else
       -      self.class.where(id: self.id).update_all(:progress => pct)
       +      self.class.where(id: self.id).update_all(progress: pct)
            end
          end
        
       @@ -112,10 +112,10 @@ class Job < ApplicationRecord
            when 'dialer'
              self.status = 'submitted'
              self.args   = Marshal.dump({
       -        :range    => self.range,
       -        :lines    => self.lines.to_i,
       -        :seconds  => self.seconds.to_i,
       -        :cid_mask => self.cid_mask
       +        range: self.range,
       +        lines: self.lines.to_i,
       +        seconds: self.seconds.to_i,
       +        cid_mask: self.cid_mask
              })
        
              return self.save
       @@ -123,18 +123,18 @@ class Job < ApplicationRecord
            when 'analysis'
              self.status = 'submitted'
              d = {
       -                                :scope      => self.scope,          # job / project/ global
       -                                :force      => !!(self.force),      # true / false
       -                                :target_id  => self.target_id.to_i, # job_id or project_id or nil
       -                                :target_ids => (self.target_ids || []).map{|x| x.to_i }
       +                                scope: self.scope,          # job / project/ global
       +                                force: !!(self.force),      # true / false
       +                                target_id: self.target_id.to_i, # job_id or project_id or nil
       +                                target_ids: (self.target_ids || []).map{|x| x.to_i }
                                }
              $stderr.puts d.inspect
        
              self.args = Marshal.dump({
       -        :scope      => self.scope,          # job / project/ global
       -        :force      => !!(self.force),      # true / false
       -        :target_id  => self.target_id.to_i, # job_id or project_id or nil
       -        :target_ids => (self.target_ids || []).map{|x| x.to_i }
       +        scope: self.scope,          # job / project/ global
       +        force: !!(self.force),      # true / false
       +        target_id: self.target_id.to_i, # job_id or project_id or nil
       +        target_ids: (self.target_ids || []).map{|x| x.to_i }
              })
              return self.save
            else
   DIR diff --git a/app/models/line.rb b/app/models/line.rb
       @@ -12,7 +12,7 @@
        #
        
        class Line < ApplicationRecord
       -  has_many :line_attributes, :dependent => :delete_all
       +  has_many :line_attributes, dependent: :delete_all
          belongs_to :project
        
          def set_attribute(name, value, ctype='text/plain')
       @@ -24,6 +24,6 @@ class Line < ApplicationRecord
          end
        
          def get_attribute(name)
       -    LineAttribute.where(:line_id => self[:id], :name => name).first
       +    LineAttribute.where(line_id: self[:id], name: name).first
          end
        end
   DIR diff --git a/app/models/project.rb b/app/models/project.rb
       @@ -18,9 +18,9 @@ class Project < ApplicationRecord
          validates_uniqueness_of :name
        
          # This is optimized for fast project deletion, even with thousands of calls/jobs/lines
       -  has_many :lines, :dependent => :delete_all
       -  has_many :line_attributes, :dependent => :delete_all
       -  has_many :calls, :dependent => :delete_all
       -  has_many :call_media, :dependent => :delete_all
       -  has_many :jobs, :dependent => :delete_all
       +  has_many :lines, dependent: :delete_all
       +  has_many :line_attributes, dependent: :delete_all
       +  has_many :calls, dependent: :delete_all
       +  has_many :call_media, dependent: :delete_all
       +  has_many :jobs, dependent: :delete_all
        end
   DIR diff --git a/app/models/provider.rb b/app/models/provider.rb
       @@ -18,6 +18,6 @@ class Provider < ApplicationRecord
          has_many :dial_results
        
          validates_presence_of :name, :host, :port, :user, :pass, :lines
       -  validates_numericality_of :port, :less_than => 65536, :greater_than => 0
       -  validates_numericality_of :lines, :less_than => 255, :greater_than => 0
       +  validates_numericality_of :port, less_than: 65536, greater_than: 0
       +  validates_numericality_of :lines, less_than: 255, greater_than: 0
        end
   DIR diff --git a/app/models/user.rb b/app/models/user.rb
       @@ -27,8 +27,8 @@ class User < ApplicationRecord
          include RailsSettings::Extend
          acts_as_authentic do |c|
            c.validate_email_field = false
       -    c.merge_validates_length_of_password_field_options :minimum => 8
       -    c.merge_validates_length_of_password_confirmation_field_options :minimum => 8
       +    c.merge_validates_length_of_password_field_options minimum: 8
       +    c.merge_validates_length_of_password_confirmation_field_options minimum: 8
            c.logged_in_timeout = 1.day
          end
        end
   DIR diff --git a/bin/adduser b/bin/adduser
       @@ -9,7 +9,7 @@ require 'bundler/setup'
        # rails/all must be required explicitly to get the railties that pro/ui/config/application.rb uses
        require 'rails/all'
        # require all the gems in the current environment
       -Bundler.require(*Rails.groups(:assets => %w(development test cucumber)))
       +Bundler.require(*Rails.groups(assets: %w(development test cucumber)))
        
        APP_PATH = File.expand_path('../../config/application',  __FILE__)
        require File.expand_path('../../config/boot',  __FILE__)
   DIR diff --git a/bin/export_audio.rb b/bin/export_audio.rb
       @@ -49,7 +49,7 @@ end
        FileUtils.mkdir_p(output)
        
        begin
       -  cond = { :project_id => project_id.to_i, :answered => true, :busy => false }
       +  cond = { project_id: project_id.to_i, answered: true, busy: false }
          if line_type
            cond[:line_type] = line_type.downcase
          end
   DIR diff --git a/bin/export_list.rb b/bin/export_list.rb
       @@ -51,7 +51,7 @@ end
        fields = %W{ number line_type caller_id answered busy audio_length ring_length peak_freq }
        begin
          $stdout.puts fields.to_csv
       -  cond = { :project_id => project_id.to_i }
       +  cond = { project_id: project_id.to_i }
          if line_type
            cond[:line_type] = line_type.downcase
          end
   DIR diff --git a/bin/iaxrecord.rb b/bin/iaxrecord.rb
       @@ -16,7 +16,7 @@ require "optparse"
        
        parser = OptionParser.new
        opts   = {
       -  :recording_time => 52
       +  recording_time: 52
        }
        
        parser.banner = "Usage: #{$0} [options]"
   DIR diff --git a/bin/import_audio.rb b/bin/import_audio.rb
       @@ -49,7 +49,7 @@ project  = nil
        provider = nil
        
        if project_id
       -  project = Project.where(:id => project_id).first
       +  project = Project.where(id: project_id).first
          unless project
            $stderr.puts "Error: Specified Project ID not found"
            exit(1)
       @@ -57,7 +57,7 @@ if project_id
        end
        
        if provider_id
       -  provider = Provider.where(:id => provider_id).first
       +  provider = Provider.where(id: provider_id).first
          unless provider
            $stderr.puts "Error: Specified Provider ID not found"
            exit(1)
       @@ -66,21 +66,21 @@ end
        
        unless project
          project = Project.create(
       -    :name       => "Import from #{dir} at #{Time.now.utc.to_s}",
       -    :created_by => "importer"
       +    name: "Import from #{dir} at #{Time.now.utc.to_s}",
       +    created_by: "importer"
          )
        end
        
        provider = Provider.first
        unless provider
          provider = Provider.create(
       -    :name    => 'Import Provider',
       -    :host    => 'localhost',
       -    :port    => 4369,
       -    :user    => "null",
       -    :pass    => "null",
       -    :lines   => 1,
       -    :enabled => false
       +    name: 'Import Provider',
       +    host: 'localhost',
       +    port: 4369,
       +    user: "null",
       +    pass: "null",
       +    lines: 1,
       +    enabled: false
          )
        end
        
       @@ -92,7 +92,7 @@ job.locked_at    = Time.now.utc
        job.started_at   = Time.now.utc
        job.created_by   = "importer"
        job.task         = "import"
       -job.args         = Marshal.dump({ :directory => dir, :project_id => project.id, :provider_id => provider.id })
       +job.args         = Marshal.dump({ directory: dir, project_id: project.id, provider_id: provider.id })
        job.status       = "running"
        job.save!
        
   DIR diff --git a/bin/resetpw b/bin/resetpw
       @@ -9,7 +9,7 @@ require 'bundler/setup'
        # rails/all must be required explicitly to get the railties that pro/ui/config/application.rb uses
        require 'rails/all'
        # require all the gems in the current environment
       -Bundler.require(*Rails.groups(:assets => %w(development test cucumber)))
       +Bundler.require(*Rails.groups(assets: %w(development test cucumber)))
        
        APP_PATH = File.expand_path('../../config/application',  __FILE__)
        require File.expand_path('../../config/boot',  __FILE__)
   DIR diff --git a/bin/worker_manager.rb b/bin/worker_manager.rb
       @@ -32,7 +32,7 @@ def stop
          end
        
          # Update the database
       -  Job.update_all({ :status => "stopped", :completed_at => Time.now.utc}, { :id => @jobs.map{|j| j[:id] } })
       +  Job.update_all({ status: "stopped", completed_at: Time.now.utc}, { id: @jobs.map{|j| j[:id] } })
        
          # Signal running jobs to shut down
          @jobs.map{|j| Process.kill("TERM", j[:pid]) rescue nil }
       @@ -55,8 +55,8 @@ end
        def schedule_job(j)
          WarVOX::Log.debug("Worker Manager is launching job #{j.id}")
          @jobs <<  {
       -    :id  => j.id,
       -    :pid => Process.fork { exec("#{@worker_path} #{j.id}") }
       +    id: j.id,
       +    pid: Process.fork { exec("#{@worker_path} #{j.id}") }
          }
        end
        
       @@ -67,7 +67,7 @@ def stop_cancelled_jobs
          end
        
          return if jids.length == 0
       -  Job.where(:status => 'cancelled', :id => jids).find_each do |j|
       +  Job.where(status: 'cancelled', id: jids).find_each do |j|
            job = @jobs.select{ |o| o[:id] == j.id }.first
            next unless job and job[:pid]
            pid = job[:pid]
       @@ -131,7 +131,7 @@ def clear_stale_jobs
          # Mark these jobs as abandoned
          if dead.length > 0
            WarVOX::Log.debug("Worker Manager is marking #{dead.length} jobs as abandoned")
       -    Job.where(:id => dead).update_all({locked_by: nil, status: 'abandoned'})
       +    Job.where(id: dead).update_all({locked_by: nil, status: 'abandoned'})
          end
        end
        
   DIR diff --git a/config/routes.rb b/config/routes.rb
       @@ -50,5 +50,5 @@ Rails.application.routes.draw do
          get '/help'                => 'home#help',  :as => :help
          get '/check'               => 'home#check', :as => :check
        
       -  root :to => "projects#index"
       +  root to: "projects#index"
        end
   DIR diff --git a/db/migrate/20121228171549_initial_schema.rb b/db/migrate/20121228171549_initial_schema.rb
       @@ -5,27 +5,27 @@ class InitialSchema < ActiveRecord::Migration[5.0]
            execute("CREATE EXTENSION IF NOT EXISTS intarray")
        
            create_table :settings do |t|
       -      t.string :var, :null => false
       -      t.text   :value, :null => true
       -      t.integer :thing_id, :null => true
       -      t.string :thing_type, :limit => 30, :null => true
       +      t.string :var, null: false
       +      t.text   :value, null: true
       +      t.integer :thing_id, null: true
       +      t.string :thing_type, limit: 30, null: true
              t.timestamps null: false
            end
        
       -    add_index :settings, [ :thing_type, :thing_id, :var ], :unique => true
       +    add_index :settings, [ :thing_type, :thing_id, :var ], unique: true
        
            create_table 'users' do |t|
       -      t.string    :login,               :null => false                # optional, you can use email instead, or both
       -      t.string    :email,               :null => true                 # optional, you can use login instead, or both
       -      t.string    :crypted_password,    :null => false                # optional, see below
       -      t.string    :password_salt,       :null => false                # optional, but highly recommended
       -      t.string    :persistence_token,   :null => false                # required
       -      t.string    :single_access_token, :null => false                # optional, see Authlogic::Session::Params
       -      t.string    :perishable_token,    :null => false                # optional, see Authlogic::Session::Perishability
       +      t.string    :login,               null: false                # optional, you can use email instead, or both
       +      t.string    :email,               null: true                 # optional, you can use login instead, or both
       +      t.string    :crypted_password,    null: false                # optional, see below
       +      t.string    :password_salt,       null: false                # optional, but highly recommended
       +      t.string    :persistence_token,   null: false                # required
       +      t.string    :single_access_token, null: false                # optional, see Authlogic::Session::Params
       +      t.string    :perishable_token,    null: false                # optional, see Authlogic::Session::Perishability
        
              # Magic columns, just like ActiveRecord's created_at and updated_at. These are automatically maintained by Authlogic if they are present.
       -      t.integer   :login_count,         :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns
       -      t.integer   :failed_login_count,  :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns
       +      t.integer   :login_count,         null: false, default: 0 # optional, see Authlogic::Session::MagicColumns
       +      t.integer   :failed_login_count,  null: false, default: 0 # optional, see Authlogic::Session::MagicColumns
              t.datetime  :last_request_at                                    # optional, see Authlogic::Session::MagicColumns
              t.datetime  :current_login_at                                   # optional, see Authlogic::Session::MagicColumns
              t.datetime  :last_login_at                                      # optional, see Authlogic::Session::MagicColumns
       @@ -33,13 +33,13 @@ class InitialSchema < ActiveRecord::Migration[5.0]
              t.string    :last_login_ip                                      # optional, see Authlogic::Session::MagicColumns
        
              t.timestamps null: false
       -      t.boolean   "enabled", :default => true
       -      t.boolean   "admin",   :default => true
       +      t.boolean   "enabled", default: true
       +      t.boolean   "admin",   default: true
            end
        
            create_table 'projects' do |t|
              t.timestamps null: false
       -      t.text      "name", :null => false
       +      t.text      "name", null: false
              t.text      "description"
              t.text    "included"
              t.text    "excluded"
       @@ -48,43 +48,43 @@ class InitialSchema < ActiveRecord::Migration[5.0]
        
            create_table "jobs" do |t|
              t.timestamps null: false
       -      t.integer  "project_id", :null => false
       +      t.integer  "project_id", null: false
              t.string  "locked_by"
              t.timestamp  "locked_at"
              t.timestamp  "started_at"
              t.timestamp  "completed_at"
              t.string  "created_by"
       -      t.string  "task", :null => false
       +      t.string  "task", null: false
              t.binary  "args"
              t.string  "status"
              t.text    "error"
       -      t.integer  "progress", :default => 0
       +      t.integer  "progress", default: 0
            end
        
            create_table "lines" do |t|
              t.timestamps null: false
       -      t.text      "number", :null => false
       -      t.integer    "project_id", :null => false
       +      t.text      "number", null: false
       +      t.integer    "project_id", null: false
              t.text      "line_type"
              t.text      "notes"
            end
        
            create_table "line_attributes" do |t|
              t.timestamps null: false
       -      t.integer    "line_id", :null => false
       -      t.integer    "project_id", :null => false
       -      t.text      "name", :null => false
       -      t.binary    "value", :null => false
       -      t.string    "content_type", :default => "text"
       +      t.integer    "line_id", null: false
       +      t.integer    "project_id", null: false
       +      t.text      "name", null: false
       +      t.binary    "value", null: false
       +      t.string    "content_type", default: "text"
            end
        
            create_table "calls" do |t|
              # Created by the dialer job
              t.timestamps null: false
       -      t.text      "number", :null => false
       -      t.integer    "project_id", :null => false
       -      t.integer    "job_id", :null => false
       -      t.integer    "provider_id", :null => false
       +      t.text      "number", null: false
       +      t.integer    "project_id", null: false
       +      t.integer    "job_id", null: false
       +      t.integer    "provider_id", null: false
              t.boolean    "answered"
              t.boolean    "busy"
              t.text      "error"
       @@ -99,12 +99,12 @@ class InitialSchema < ActiveRecord::Migration[5.0]
              t.float      "peak_freq"
              t.text      "peak_freq_data"
              t.text      "line_type"
       -      t.integer    "fprint", :array => true
       +      t.integer    "fprint", array: true
            end
        
            create_table "call_media" do |t|
       -      t.integer    "call_id", :null => false
       -      t.integer    "project_id", :null => false
       +      t.integer    "call_id", null: false
       +      t.integer    "project_id", null: false
              t.binary    "audio"
              t.binary    "mp3"
              t.binary    "png_big"
       @@ -116,7 +116,7 @@ class InitialSchema < ActiveRecord::Migration[5.0]
        
            create_table "signatures" do |t|
              t.timestamps null: false
       -      t.text      "name", :null => false
       +      t.text      "name", null: false
              t.string    "source"
              t.text      "description"
              t.string    "category"
       @@ -125,19 +125,19 @@ class InitialSchema < ActiveRecord::Migration[5.0]
            end
        
            create_table "signature_fp" do |t|
       -      t.integer    "signature_id", :null => false
       -      t.integer    "fprint", :array => true
       +      t.integer    "signature_id", null: false
       +      t.integer    "fprint", array: true
            end
        
            create_table "providers" do |t|
              t.timestamps null: false
       -      t.text      "name", :null => false
       -      t.text      "host", :null => false
       -      t.integer    "port", :null => false
       +      t.text      "name", null: false
       +      t.text      "host", null: false
       +      t.integer    "port", null: false
              t.text      "user"
              t.text      "pass"
       -      t.integer    "lines", :null => false, :default => 1
       -      t.boolean    "enabled", :default => true
       +      t.integer    "lines", null: false, default: 1
       +      t.boolean    "enabled", default: true
            end
        
            add_index :jobs, :project_id
   DIR diff --git a/db/migrate/20130113004653_create_reportable_cache.rb b/db/migrate/20130113004653_create_reportable_cache.rb
       @@ -1,13 +1,13 @@
        class CreateReportableCache < ActiveRecord::Migration[5.0]
          def up
       -    create_table :reportable_cache, :force => true do |t|
       -      t.string   :model_name,       :null => false, :limit => 100
       -      t.string   :report_name,      :null => false, :limit => 100
       -      t.string   :grouping,         :null => false, :limit => 10
       -      t.string   :aggregation,      :null => false, :limit => 10
       -      t.string   :conditions,       :null => false, :limit => 100
       -      t.float    :value,            :null => false,                :default => 0
       -      t.datetime :reporting_period, :null => false
       +    create_table :reportable_cache, force: true do |t|
       +      t.string   :model_name,       null: false, limit: 100
       +      t.string   :report_name,      null: false, limit: 100
       +      t.string   :grouping,         null: false, limit: 10
       +      t.string   :aggregation,      null: false, limit: 10
       +      t.string   :conditions,       null: false, limit: 100
       +      t.float    :value,            null: false,                default: 0
       +      t.datetime :reporting_period, null: false
        
              t.timestamps null: false
            end
       @@ -18,7 +18,7 @@ class CreateReportableCache < ActiveRecord::Migration[5.0]
              :grouping,
              :aggregation,
              :conditions
       -    ], :name => :name_model_grouping_agregation
       +    ], name: :name_model_grouping_agregation
            add_index :reportable_cache, [
              :model_name,
              :report_name,
       @@ -26,12 +26,12 @@ class CreateReportableCache < ActiveRecord::Migration[5.0]
              :aggregation,
              :conditions,
              :reporting_period
       -    ], :unique => true, :name => :name_model_grouping_aggregation_period
       +    ], unique: true, name: :name_model_grouping_aggregation_period
          end
        
          def self.down
       -    remove_index :reportable_cache, :name => :name_model_grouping_agregation
       -    remove_index :reportable_cache, :name => :name_model_grouping_aggregation_period
       +    remove_index :reportable_cache, name: :name_model_grouping_agregation
       +    remove_index :reportable_cache, name: :name_model_grouping_aggregation_period
        
            drop_table :reportable_cache
          end
   DIR diff --git a/lib/warvox/audio/raw.rb b/lib/warvox/audio/raw.rb
       @@ -88,7 +88,7 @@ class Raw
              raise RuntimeError, "The sox binary could not be find, make sure it is installed"
            end
        
       -    o, s = Open3.capture2("#{sox} -t raw -b 16 -e signed-integer -r 8000 - -t flac -r 16000 -", :binmode => true, :stdin_data => self.to_raw)
       +    o, s = Open3.capture2("#{sox} -t raw -b 16 -e signed-integer -r 8000 - -t flac -r 16000 -", binmode: true, stdin_data: self.to_raw)
            o
          end
        
   DIR diff --git a/lib/warvox/jobs/analysis.rb b/lib/warvox/jobs/analysis.rb
       @@ -72,27 +72,27 @@ class Analysis < Base
            case @conf[:scope]
            when 'calls'
              if @conf[:force]
       -        query = {:id => @conf[:target_ids], :answered => true, :busy => false}
       +        query = {id: @conf[:target_ids], answered: true, busy: false}
              else
       -        query = {:id => @conf[:target_ids], :answered => true, :busy => false, :analysis_started_at => nil}
       +        query = {id: @conf[:target_ids], answered: true, busy: false, analysis_started_at: nil}
              end
            when 'job'
              if @conf[:force]
       -        query = {:job_id => @conf[:target_id], :answered => true, :busy => false}
       +        query = {job_id: @conf[:target_id], answered: true, busy: false}
              else
       -        query = {:job_id => @conf[:target_id], :answered => true, :busy => false, :analysis_started_at => nil}
       +        query = {job_id: @conf[:target_id], answered: true, busy: false, analysis_started_at: nil}
              end
            when 'project'
              if @conf[:force]
       -        query = {:project_id => @conf[:target_id], :answered => true, :busy => false}
       +        query = {project_id: @conf[:target_id], answered: true, busy: false}
              else
       -        query = {:project_id => @conf[:target_id], :answered => true, :busy => false, :analysis_started_at => nil}
       +        query = {project_id: @conf[:target_id], answered: true, busy: false, analysis_started_at: nil}
              end
            when 'global'
              if @conf[:force]
       -        query = {:answered => true, :busy => false}
       +        query = {answered: true, busy: false}
              else
       -        query = {:answered => true, :busy => false, :analysis_started_at => nil}
       +        query = {answered: true, busy: false, analysis_started_at: nil}
              end
            else
              # Bail if we don't have a valid scope
       @@ -295,14 +295,14 @@ class Analysis < Base
            sproc = Classifier.new
            sproc.data =
            {
       -      :raw  => raw,
       -      :freq => freq,
       -      :fcnt => fcnt,
       -      :fft  => fft,
       -      :pks  => pks,
       -      :pkz  => pkz,
       -      :maxf => maxf,
       -      :maxp => maxp
       +      raw: raw,
       +      freq: freq,
       +      fcnt: fcnt,
       +      fft: fft,
       +      pks: pks,
       +      pkz: pkz,
       +      maxf: maxf,
       +      maxp: maxp
            }
        
            WarVOX::Config.classifiers_load.each do |sigfile|
   DIR diff --git a/lib/warvox/jobs/dialer.rb b/lib/warvox/jobs/dialer.rb
       @@ -48,15 +48,15 @@ class Dialer < Base
            res = []
        
            ::ActiveRecord::Base.connection_pool.with_connection {
       -      ::Provider.where(:enabled => true).all.each do |prov|
       +      ::Provider.where(enabled: true).all.each do |prov|
                info = {
       -          :name  => prov.name,
       -          :id    => prov.id,
       -          :port  => prov.port,
       -          :host  => prov.host,
       -          :user  => prov.user,
       -          :pass  => prov.pass,
       -          :lines => prov.lines
       +          name: prov.name,
       +          id: prov.id,
       +          port: prov.port,
       +          host: prov.host,
       +          user: prov.user,
       +          pass: prov.pass,
       +          lines: prov.lines
                }
                1.upto(prov.lines) {|i| res.push(info) }
              end
   DIR diff --git a/lib/warvox/proto/iax2/client.rb b/lib/warvox/proto/iax2/client.rb
       @@ -22,10 +22,10 @@ class Client
        
          def initialize(uopts={})
            opts = {
       -      :caller_number => '15555555555',
       -      :caller_name   => '',
       -      :server_port   => IAX2_DEFAULT_PORT,
       -      :context       => { }
       +      caller_number: '15555555555',
       +      caller_name: '',
       +      server_port: IAX2_DEFAULT_PORT,
       +      context: { }
            }.merge(uopts)
        
            self.caller_name   = opts[:caller_name]
   DIR diff --git a/spec/factories/settings.rb b/spec/factories/settings.rb
       @@ -12,7 +12,7 @@
        #
        
        FactoryGirl.define do
       -  factory :setting, :class => 'Settings' do
       +  factory :setting, class: 'Settings' do
            var "CachedStuff"
          end