You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: how_to_verify_controller.rb
    path of file: ./repos/identity-idp/app/controllers/idv
    
    the code of the file until where you have to start completion: module Idv
  class HowToVerifyController < ApplicationController
    include Idv::AvailabilityConcern
    include IdvStepConcern
    include RenderConditionConcern

    before_action :confirm_step_allowed

    check_or_render_not_found -> { self.class.enabled? }

    def show
      @selection = if idv_session.skip_doc_auth == false
                     Idv::HowToVerifyForm::REMOTE
      elsif idv_session.skip_doc_auth == true
        Idv::HowToVerifyForm::IPP
      end

      analytics.idv_doc_auth_how_to_verify_visited(**analytics_arguments)
      @idv
    
    def self.step_info
      Idv::StepInfo.new(
        key: :how_to_verify,
        controller: self,
        next_steps: [:hybrid_handoff, :document_capture],
        preconditions: ->(idv_session:, user:) do
          self.enabled? &&
          idv_session.idv_consent_given &&
          idv_session.service_provider&.in_person_proofing_enabled
        end,
        undo_step: ->(idv_session:, user:) {
                     idv_session.skip_doc_auth = nil
                     idv_session.opted_in_to_in_person_proofing = nil
                   },
      )
    end

    private

    def analytics_arguments
      {
        step: 'how_to_verify',
        analytics_id: 'Doc Auth',
        skip_hybrid_handoff: idv_session.skip_hybrid_handoff,
        irs_reproofing: irs_reproofing?,
      }.merge(ab_test_analytics_buckets)
    end

    def how_to_verify_form_params
      params.require(:idv_how_to_verify_form).permit(:selection, selection: [])
    rescue ActionController::ParameterMissing
      ActionController::Parameters.new(selection: [])
    end
  end