program change_a_little_bit
    implicit none
    integer(8),parameter:: md=1000000007_8
    integer(8):: n,i,ans=0
    integer(8),allocatable:: c(:)

    read*,n
    allocate(c(n))
    read*,c(:)
    call merge_sort(c,1_8,n)
    
    do i=1, n
        ans = mod(ans + mod(c(i)*mod(pow_fast(2_8,n-1,md)+mod(pow_fast(2_8,n-2,md)*(n-i),md),md),md),md)
    end do

    print*, mod(ans*pow_fast(2_8,n,md),md)
contains

recursive subroutine merge_sort(ar,fst,lst)
    integer(8):: ar(:), fst, lst, mid, tmp

    if (lst-fst < 2) then
        if(ar(lst) < ar(fst)) then
            tmp = ar(lst)
            ar(lst) = ar(fst)
            ar(fst) = tmp
        end if
        return
    end if

    mid = (fst+lst)/2
    call merge_sort(ar,fst,mid)
    call merge_sort(ar,mid+1,lst)
    call merge(ar,fst,mid,lst)
end subroutine

subroutine merge(ar,fst,mid,lst)
    integer(8):: ar(:), fst, mid, lst
    integer(8),pointer:: tmp(:)
    integer(8):: it,il,ir

    allocate(tmp(lst-fst+1))
    it = 1
    il = fst
    ir = mid+1
    do while(il<=mid .and. ir<=lst)
        if (ar(il) <= ar(ir)) then
            tmp(it) = ar(il)
            il=il+1        
        else
            tmp(it) = ar(ir)
            ir=ir+1
        end if
        it=it+1
    end do

    if (ir > lst) then
        tmp(it:) = ar(il:mid)
    else
        tmp(it:) = ar(ir:lst)
    end if

    ar(fst:lst) = tmp(:)
    deallocate(tmp)
end subroutine

function pow_fast(x,pow,md) result(ret)
    integer(8),value:: x, pow
    integer(8)::md,ret

    ret=1_8
    if (x==1 .or. pow==0) return

    do while(pow > 0_8)
        if (mod(pow,2_8) == 1_8) then
            ret = mod(ret*x,md)
        end if
        x = mod(x*x,md)
        pow = pow/2_8
    end do

end function



end program change_a_little_bit
; ModuleID = 'FIRModule'
source_filename = "FIRModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@_QFEans = internal unnamed_addr global i64 0
@_QFEc.0 = internal unnamed_addr global ptr null
@_QFEc.8 = internal unnamed_addr global i64 0
@_QQcl.2983a83ceebff55834224af8aeec85dd = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_2700/source.f\00"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #1

define void @_QQmain() local_unnamed_addr {
  %1 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %2 = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, align 8
  %3 = alloca i64, align 8
  %4 = alloca i64, align 8
  %5 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.2983a83ceebff55834224af8aeec85dd, i32 7)
  %6 = call i1 @_FortranAioInputInteger(ptr %5, ptr nonnull %4, i32 8)
  %7 = call i32 @_FortranAioEndIoStatement(ptr %5)
  %8 = load i64, ptr %4, align 8, !tbaa !3
  %9 = call i64 @llvm.smax.i64(i64 %8, i64 0)
  %10 = shl i64 %9, 3
  %11 = call ptr @malloc(i64 %10)
  store ptr %11, ptr @_QFEc.0, align 8, !tbaa !7
  store i64 %9, ptr @_QFEc.8, align 8, !tbaa !7
  %12 = call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.2983a83ceebff55834224af8aeec85dd, i32 9)
  %.unpack = load ptr, ptr @_QFEc.0, align 8, !tbaa !7
  %.unpack135.unpack.unpack137 = load i64, ptr @_QFEc.8, align 8, !tbaa !7
  %13 = call i64 @llvm.smax.i64(i64 %.unpack135.unpack.unpack137, i64 0)
  store ptr %.unpack, ptr %2, align 8, !tbaa !7
  %.fca.1.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 1
  store i64 8, ptr %.fca.1.gep, align 8, !tbaa !7
  %.fca.2.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 2
  store i32 20180515, ptr %.fca.2.gep, align 8, !tbaa !7
  %.fca.3.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 3
  store i8 1, ptr %.fca.3.gep, align 4, !tbaa !7
  %.fca.4.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 4
  store i8 10, ptr %.fca.4.gep, align 1, !tbaa !7
  %.fca.5.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 5
  store i8 0, ptr %.fca.5.gep, align 2, !tbaa !7
  %.fca.6.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 6
  store i8 0, ptr %.fca.6.gep, align 1, !tbaa !7
  %.fca.7.0.0.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 7, i64 0, i64 0
  store i64 1, ptr %.fca.7.0.0.gep, align 8, !tbaa !7
  %.fca.7.0.1.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 7, i64 0, i64 1
  store i64 %13, ptr %.fca.7.0.1.gep, align 8, !tbaa !7
  %.fca.7.0.2.gep = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %2, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep, align 8, !tbaa !7
  %14 = call i1 @_FortranAioInputDescriptor(ptr %12, ptr nonnull %2)
  %15 = call i32 @_FortranAioEndIoStatement(ptr %12)
  %.unpack140 = load ptr, ptr @_QFEc.0, align 8, !tbaa !7
  %.unpack147.unpack.unpack149 = load i64, ptr @_QFEc.8, align 8, !tbaa !7
  store ptr %.unpack140, ptr %1, align 8, !tbaa !7
  %.fca.1.gep73 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 1
  store i64 8, ptr %.fca.1.gep73, align 8, !tbaa !7
  %.fca.2.gep75 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 2
  store i32 20180515, ptr %.fca.2.gep75, align 8, !tbaa !7
  %.fca.3.gep77 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 3
  store i8 1, ptr %.fca.3.gep77, align 4, !tbaa !7
  %.fca.4.gep79 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 4
  store i8 10, ptr %.fca.4.gep79, align 1, !tbaa !7
  %.fca.5.gep81 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 5
  store i8 0, ptr %.fca.5.gep81, align 2, !tbaa !7
  %.fca.6.gep83 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 6
  store i8 0, ptr %.fca.6.gep83, align 1, !tbaa !7
  %.fca.7.0.0.gep85 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 0
  store i64 1, ptr %.fca.7.0.0.gep85, align 8, !tbaa !7
  %.fca.7.0.1.gep87 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 1
  store i64 %.unpack147.unpack.unpack149, ptr %.fca.7.0.1.gep87, align 8, !tbaa !7
  %.fca.7.0.2.gep89 = getelementptr inbounds { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %1, i64 0, i32 7, i64 0, i64 2
  store i64 8, ptr %.fca.7.0.2.gep89, align 8, !tbaa !7
  store i64 1, ptr %3, align 8, !tbaa !3
  call void @_QFPmerge_sort(ptr nonnull %1, ptr nonnull %3, ptr nonnull %4)
  %16 = load i64, ptr %4, align 8, !tbaa !3
  %_QFEans.promoted = load i64, ptr @_QFEans, align 8, !tbaa !3
  %17 = icmp sgt i64 %16, 0
  br i1 %17, label %.lr.ph, label %117

.lr.ph:                                           ; preds = %0
  %.unpack152 = load ptr, ptr @_QFEc.0, align 8, !tbaa !7
  %18 = add nsw i64 %16, -1
  %.not = icmp eq i64 %18, 0
  %19 = add nsw i64 %16, -2
  %20 = icmp sgt i64 %16, 2
  br i1 %.not, label %.lr.ph.split, label %.preheader.i.preheader.us

.preheader.i.preheader.us:                        ; preds = %.lr.ph, %_QFPpow_fast.exit172.us
  %21 = phi i64 [ %51, %_QFPpow_fast.exit172.us ], [ 1, %.lr.ph ]
  %22 = phi i64 [ %50, %_QFPpow_fast.exit172.us ], [ %_QFEans.promoted, %.lr.ph ]
  %23 = add i64 %21, -1
  %24 = getelementptr i64, ptr %.unpack152, i64 %23
  %25 = load i64, ptr %24, align 8, !tbaa !3
  br label %.preheader.i.us

.preheader.i.us:                                  ; preds = %.preheader.i.preheader.us, %30
  %.012.i.us = phi i64 [ %32, %30 ], [ 2, %.preheader.i.preheader.us ]
  %.011.i.us = phi i64 [ %33, %30 ], [ %18, %.preheader.i.preheader.us ]
  %.0.i.us = phi i64 [ %.1.i.us, %30 ], [ 1, %.preheader.i.preheader.us ]
  %26 = and i64 %.011.i.us, 1
  %.not.i.us = icmp eq i64 %26, 0
  br i1 %.not.i.us, label %30, label %27

27:                                               ; preds = %.preheader.i.us
  %28 = mul i64 %.0.i.us, %.012.i.us
  %29 = srem i64 %28, 1000000007
  br label %30

30:                                               ; preds = %27, %.preheader.i.us
  %.1.i.us = phi i64 [ %29, %27 ], [ %.0.i.us, %.preheader.i.us ]
  %31 = mul nuw nsw i64 %.012.i.us, %.012.i.us
  %32 = urem i64 %31, 1000000007
  %33 = lshr i64 %.011.i.us, 1
  %.old1.not.i.us = icmp ult i64 %.011.i.us, 2
  br i1 %.old1.not.i.us, label %_QFPpow_fast.exit.loopexit.us, label %.preheader.i.us

.preheader.i164.us:                               ; preds = %_QFPpow_fast.exit.loopexit.us, %38
  %.012.i165.us = phi i64 [ %40, %38 ], [ 2, %_QFPpow_fast.exit.loopexit.us ]
  %.011.i166.us = phi i64 [ %41, %38 ], [ %19, %_QFPpow_fast.exit.loopexit.us ]
  %.0.i167.us = phi i64 [ %.1.i169.us, %38 ], [ 1, %_QFPpow_fast.exit.loopexit.us ]
  %34 = and i64 %.011.i166.us, 1
  %.not.i168.us = icmp eq i64 %34, 0
  br i1 %.not.i168.us, label %38, label %35

35:                                               ; preds = %.preheader.i164.us
  %36 = mul i64 %.0.i167.us, %.012.i165.us
  %37 = srem i64 %36, 1000000007
  br label %38

38:                                               ; preds = %35, %.preheader.i164.us
  %.1.i169.us = phi i64 [ %37, %35 ], [ %.0.i167.us, %.preheader.i164.us ]
  %39 = mul nuw nsw i64 %.012.i165.us, %.012.i165.us
  %40 = urem i64 %39, 1000000007
  %41 = lshr i64 %.011.i166.us, 1
  %.old1.not.i170.us = icmp ult i64 %.011.i166.us, 2
  br i1 %.old1.not.i170.us, label %_QFPpow_fast.exit172.us, label %.preheader.i164.us

_QFPpow_fast.exit172.us:                          ; preds = %38, %_QFPpow_fast.exit.loopexit.us
  %.2.i171.us = phi i64 [ 1, %_QFPpow_fast.exit.loopexit.us ], [ %.1.i169.us, %38 ]
  %42 = sub i64 %16, %21
  %43 = mul i64 %.2.i171.us, %42
  %44 = srem i64 %43, 1000000007
  %45 = add i64 %44, %.1.i.us
  %46 = srem i64 %45, 1000000007
  %47 = mul i64 %46, %25
  %48 = srem i64 %47, 1000000007
  %49 = add i64 %48, %22
  %50 = srem i64 %49, 1000000007
  %51 = add nuw i64 %21, 1
  %exitcond204.not = icmp eq i64 %16, %21
  br i1 %exitcond204.not, label %._crit_edge, label %.preheader.i.preheader.us

_QFPpow_fast.exit.loopexit.us:                    ; preds = %30
  br i1 %20, label %.preheader.i164.us, label %_QFPpow_fast.exit172.us

.lr.ph.split:                                     ; preds = %.lr.ph
  br i1 %20, label %_QFPpow_fast.exit.us184, label %._crit_edge.loopexit211

_QFPpow_fast.exit.us184:                          ; preds = %.lr.ph.split
  %52 = load i64, ptr %.unpack152, align 8, !tbaa !3
  br label %.preheader.i164.us185

.preheader.i164.us185:                            ; preds = %_QFPpow_fast.exit.us184, %57
  %.012.i165.us186 = phi i64 [ %59, %57 ], [ 2, %_QFPpow_fast.exit.us184 ]
  %.011.i166.us187 = phi i64 [ %60, %57 ], [ %19, %_QFPpow_fast.exit.us184 ]
  %.0.i167.us188 = phi i64 [ %.1.i169.us190, %57 ], [ 1, %_QFPpow_fast.exit.us184 ]
  %53 = and i64 %.011.i166.us187, 1
  %.not.i168.us189 = icmp eq i64 %53, 0
  br i1 %.not.i168.us189, label %57, label %54

54:                                               ; preds = %.preheader.i164.us185
  %55 = mul i64 %.0.i167.us188, %.012.i165.us186
  %56 = srem i64 %55, 1000000007
  br label %57

57:                                               ; preds = %54, %.preheader.i164.us185
  %.1.i169.us190 = phi i64 [ %56, %54 ], [ %.0.i167.us188, %.preheader.i164.us185 ]
  %58 = mul nuw nsw i64 %.012.i165.us186, %.012.i165.us186
  %59 = urem i64 %58, 1000000007
  %60 = lshr i64 %.011.i166.us187, 1
  %.old1.not.i170.us191 = icmp ult i64 %.011.i166.us187, 2
  br i1 %.old1.not.i170.us191, label %_QFPpow_fast.exit172.loopexit.us195, label %.preheader.i164.us185

_QFPpow_fast.exit172.loopexit.us195:              ; preds = %57
  %61 = add i64 %16, -1
  %62 = mul i64 %.1.i169.us190, %61
  %63 = srem i64 %62, 1000000007
  %64 = trunc i64 %63 to i32
  %.lhs.trunc = add nsw i32 %64, 1
  %65 = srem i32 %.lhs.trunc, 1000000007
  %.sext = sext i32 %65 to i64
  %66 = mul i64 %52, %.sext
  %67 = srem i64 %66, 1000000007
  %68 = add i64 %67, %_QFEans.promoted
  %69 = srem i64 %68, 1000000007
  %exitcond203.not = icmp eq i64 %16, 1
  br i1 %exitcond203.not, label %._crit_edge, label %_QFPpow_fast.exit.us184.1

_QFPpow_fast.exit.us184.1:                        ; preds = %_QFPpow_fast.exit172.loopexit.us195
  %70 = getelementptr i64, ptr %.unpack152, i64 1
  %71 = load i64, ptr %70, align 8, !tbaa !3
  br label %.preheader.i164.us185.1

.preheader.i164.us185.1:                          ; preds = %76, %_QFPpow_fast.exit.us184.1
  %.012.i165.us186.1 = phi i64 [ %78, %76 ], [ 2, %_QFPpow_fast.exit.us184.1 ]
  %.011.i166.us187.1 = phi i64 [ %79, %76 ], [ %19, %_QFPpow_fast.exit.us184.1 ]
  %.0.i167.us188.1 = phi i64 [ %.1.i169.us190.1, %76 ], [ 1, %_QFPpow_fast.exit.us184.1 ]
  %72 = and i64 %.011.i166.us187.1, 1
  %.not.i168.us189.1 = icmp eq i64 %72, 0
  br i1 %.not.i168.us189.1, label %76, label %73

73:                                               ; preds = %.preheader.i164.us185.1
  %74 = mul i64 %.0.i167.us188.1, %.012.i165.us186.1
  %75 = srem i64 %74, 1000000007
  br label %76

76:                                               ; preds = %73, %.preheader.i164.us185.1
  %.1.i169.us190.1 = phi i64 [ %75, %73 ], [ %.0.i167.us188.1, %.preheader.i164.us185.1 ]
  %77 = mul nuw nsw i64 %.012.i165.us186.1, %.012.i165.us186.1
  %78 = urem i64 %77, 1000000007
  %79 = lshr i64 %.011.i166.us187.1, 1
  %.old1.not.i170.us191.1 = icmp ult i64 %.011.i166.us187.1, 2
  br i1 %.old1.not.i170.us191.1, label %_QFPpow_fast.exit172.loopexit.us195.1, label %.preheader.i164.us185.1

_QFPpow_fast.exit172.loopexit.us195.1:            ; preds = %76
  %80 = add i64 %16, -2
  %81 = mul i64 %.1.i169.us190.1, %80
  %82 = srem i64 %81, 1000000007
  %83 = trunc i64 %82 to i32
  %.lhs.trunc.1 = add nsw i32 %83, 1
  %84 = srem i32 %.lhs.trunc.1, 1000000007
  %.sext.1 = sext i32 %84 to i64
  %85 = mul i64 %71, %.sext.1
  %86 = srem i64 %85, 1000000007
  %87 = add nsw i64 %86, %69
  %88 = srem i64 %87, 1000000007
  %exitcond203.not.1 = icmp eq i64 %16, 2
  br i1 %exitcond203.not.1, label %._crit_edge, label %_QFPpow_fast.exit.us184.2

_QFPpow_fast.exit.us184.2:                        ; preds = %_QFPpow_fast.exit172.loopexit.us195.1
  %89 = getelementptr i64, ptr %.unpack152, i64 2
  %90 = load i64, ptr %89, align 8, !tbaa !3
  br label %.preheader.i164.us185.2

.preheader.i164.us185.2:                          ; preds = %95, %_QFPpow_fast.exit.us184.2
  %.012.i165.us186.2 = phi i64 [ %97, %95 ], [ 2, %_QFPpow_fast.exit.us184.2 ]
  %.011.i166.us187.2 = phi i64 [ %98, %95 ], [ %19, %_QFPpow_fast.exit.us184.2 ]
  %.0.i167.us188.2 = phi i64 [ %.1.i169.us190.2, %95 ], [ 1, %_QFPpow_fast.exit.us184.2 ]
  %91 = and i64 %.011.i166.us187.2, 1
  %.not.i168.us189.2 = icmp eq i64 %91, 0
  br i1 %.not.i168.us189.2, label %95, label %92

92:                                               ; preds = %.preheader.i164.us185.2
  %93 = mul i64 %.0.i167.us188.2, %.012.i165.us186.2
  %94 = srem i64 %93, 1000000007
  br label %95

95:                                               ; preds = %92, %.preheader.i164.us185.2
  %.1.i169.us190.2 = phi i64 [ %94, %92 ], [ %.0.i167.us188.2, %.preheader.i164.us185.2 ]
  %96 = mul nuw nsw i64 %.012.i165.us186.2, %.012.i165.us186.2
  %97 = urem i64 %96, 1000000007
  %98 = lshr i64 %.011.i166.us187.2, 1
  %.old1.not.i170.us191.2 = icmp ult i64 %.011.i166.us187.2, 2
  br i1 %.old1.not.i170.us191.2, label %_QFPpow_fast.exit172.loopexit.us195.2, label %.preheader.i164.us185.2

_QFPpow_fast.exit172.loopexit.us195.2:            ; preds = %95
  %99 = add i64 %16, -3
  %100 = mul i64 %.1.i169.us190.2, %99
  %101 = srem i64 %100, 1000000007
  %102 = trunc i64 %101 to i32
  %.lhs.trunc.2 = add nsw i32 %102, 1
  %103 = srem i32 %.lhs.trunc.2, 1000000007
  %.sext.2 = sext i32 %103 to i64
  %104 = mul i64 %90, %.sext.2
  %105 = srem i64 %104, 1000000007
  %106 = add nsw i64 %105, %88
  %107 = srem i64 %106, 1000000007
  br label %._crit_edge

._crit_edge.loopexit211:                          ; preds = %.lr.ph.split
  %108 = load i64, ptr %.unpack152, align 8, !tbaa !3
  %109 = add i64 %16, -1
  %110 = srem i64 %109, 1000000007
  %111 = trunc i64 %110 to i32
  %.lhs.trunc205 = add nsw i32 %111, 1
  %112 = srem i32 %.lhs.trunc205, 1000000007
  %.sext206 = sext i32 %112 to i64
  %113 = mul i64 %108, %.sext206
  %114 = srem i64 %113, 1000000007
  %115 = add i64 %114, %_QFEans.promoted
  %116 = srem i64 %115, 1000000007
  br label %._crit_edge

._crit_edge:                                      ; preds = %_QFPpow_fast.exit172.us, %_QFPpow_fast.exit172.loopexit.us195, %_QFPpow_fast.exit172.loopexit.us195.1, %_QFPpow_fast.exit172.loopexit.us195.2, %._crit_edge.loopexit211
  %.us-phi = phi i64 [ %116, %._crit_edge.loopexit211 ], [ %69, %_QFPpow_fast.exit172.loopexit.us195 ], [ %88, %_QFPpow_fast.exit172.loopexit.us195.1 ], [ %107, %_QFPpow_fast.exit172.loopexit.us195.2 ], [ %50, %_QFPpow_fast.exit172.us ]
  store i64 %.us-phi, ptr @_QFEans, align 8, !tbaa !3
  br label %117

117:                                              ; preds = %._crit_edge, %0
  %118 = call ptr @_FortranAioBeginExternalListOutput(i32 -1, ptr nonnull @_QQcl.2983a83ceebff55834224af8aeec85dd, i32 16)
  %119 = load i64, ptr @_QFEans, align 8, !tbaa !3
  %120 = load i64, ptr %4, align 8, !tbaa !3
  %121 = icmp sgt i64 %120, 0
  br i1 %121, label %.preheader.i173, label %_QFPpow_fast.exit181

.preheader.i173:                                  ; preds = %117, %126
  %.012.i174 = phi i64 [ %128, %126 ], [ 2, %117 ]
  %.011.i175 = phi i64 [ %129, %126 ], [ %120, %117 ]
  %.0.i176 = phi i64 [ %.1.i178, %126 ], [ 1, %117 ]
  %122 = and i64 %.011.i175, 1
  %.not.i177 = icmp eq i64 %122, 0
  br i1 %.not.i177, label %126, label %123

123:                                              ; preds = %.preheader.i173
  %124 = mul i64 %.0.i176, %.012.i174
  %125 = srem i64 %124, 1000000007
  br label %126

126:                                              ; preds = %123, %.preheader.i173
  %.1.i178 = phi i64 [ %125, %123 ], [ %.0.i176, %.preheader.i173 ]
  %127 = mul nuw nsw i64 %.012.i174, %.012.i174
  %128 = urem i64 %127, 1000000007
  %129 = lshr i64 %.011.i175, 1
  %.old1.not.i179 = icmp ult i64 %.011.i175, 2
  br i1 %.old1.not.i179, label %_QFPpow_fast.exit181, label %.preheader.i173

_QFPpow_fast.exit181:                             ; preds = %126, %117
  %.2.i180 = phi i64 [ 1, %117 ], [ %.1.i178, %126 ]
  %130 = mul i64 %.2.i180, %119
  %131 = srem i64 %130, 1000000007
  %132 = call i1 @_FortranAioOutputInteger64(ptr %118, i64 %131)
  %133 = call i32 @_FortranAioEndIoStatement(ptr %118)
  ret void
}

; Function Attrs: nounwind
define void @_QFPmerge_sort(ptr %0, ptr nocapture readonly %1, ptr nocapture readonly %2) local_unnamed_addr #2 {
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = load i64, ptr %2, align 8, !tbaa !3
  %7 = load i64, ptr %1, align 8, !tbaa !3
  %8 = sub i64 %6, %7
  %9 = icmp slt i64 %8, 2
  br i1 %9, label %10, label %28

10:                                               ; preds = %3
  %11 = add i64 %6, -1
  %12 = load ptr, ptr %0, align 8, !tbaa !7
  %13 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %14 = load i64, ptr %13, align 8, !tbaa !7
  %15 = mul i64 %14, %11
  %16 = getelementptr i8, ptr %12, i64 %15
  %17 = load i64, ptr %16, align 8, !tbaa !3
  %18 = add i64 %7, -1
  %19 = mul i64 %14, %18
  %20 = getelementptr i8, ptr %12, i64 %19
  %21 = load i64, ptr %20, align 8, !tbaa !3
  %22 = icmp slt i64 %17, %21
  br i1 %22, label %23, label %32

23:                                               ; preds = %10
  store i64 %21, ptr %16, align 8, !tbaa !3
  %24 = load i64, ptr %1, align 8, !tbaa !3
  %25 = add i64 %24, -1
  %26 = mul i64 %25, %14
  %27 = getelementptr i8, ptr %12, i64 %26
  store i64 %17, ptr %27, align 8, !tbaa !3
  br label %32

28:                                               ; preds = %3
  %29 = add i64 %7, %6
  %30 = sdiv i64 %29, 2
  store i64 %30, ptr %5, align 8, !tbaa !3
  call void @_QFPmerge_sort(ptr %0, ptr nonnull %1, ptr nonnull %5)
  %31 = add nsw i64 %30, 1
  store i64 %31, ptr %4, align 8, !tbaa !3
  call void @_QFPmerge_sort(ptr %0, ptr nonnull %4, ptr nonnull %2)
  call void @_QFPmerge(ptr %0, ptr nonnull %1, ptr nonnull %5, ptr nonnull %2)
  br label %32

32:                                               ; preds = %23, %10, %28
  ret void
}

; Function Attrs: nounwind
define void @_QFPmerge(ptr nocapture readonly %0, ptr nocapture readonly %1, ptr nocapture readonly %2, ptr nocapture readonly %3) local_unnamed_addr #2 {
  %5 = load i64, ptr %3, align 8, !tbaa !3
  %6 = load i64, ptr %1, align 8, !tbaa !3
  %7 = add i64 %5, 1
  %8 = sub i64 %7, %6
  %9 = tail call i64 @llvm.smax.i64(i64 %8, i64 0)
  %10 = shl i64 %9, 3
  %11 = tail call ptr @malloc(i64 %10)
  %12 = load i64, ptr %2, align 8, !tbaa !3
  %13 = add i64 %12, 1
  %14 = icmp sle i64 %6, %12
  %15 = icmp sle i64 %13, %5
  %16 = and i1 %14, %15
  br i1 %16, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %4
  %17 = load ptr, ptr %0, align 8, !tbaa !7
  %18 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %19 = load i64, ptr %18, align 8, !tbaa !7
  br label %20

20:                                               ; preds = %.lr.ph, %36
  %.0433 = phi i64 [ 1, %.lr.ph ], [ %37, %36 ]
  %.0421432 = phi i64 [ %13, %.lr.ph ], [ %.1, %36 ]
  %.0422431 = phi i64 [ %6, %.lr.ph ], [ %.1423, %36 ]
  %21 = add i64 %.0422431, -1
  %22 = mul i64 %19, %21
  %23 = getelementptr i8, ptr %17, i64 %22
  %24 = load i64, ptr %23, align 8, !tbaa !3
  %25 = add i64 %.0421432, -1
  %26 = mul i64 %19, %25
  %27 = getelementptr i8, ptr %17, i64 %26
  %28 = load i64, ptr %27, align 8, !tbaa !3
  %.not = icmp sgt i64 %24, %28
  %29 = shl i64 %.0433, 3
  %30 = add i64 %29, -8
  %31 = getelementptr i8, ptr %11, i64 %30
  br i1 %.not, label %34, label %32

32:                                               ; preds = %20
  store i64 %24, ptr %31, align 8, !tbaa !3
  %33 = add i64 %.0422431, 1
  br label %36

34:                                               ; preds = %20
  store i64 %28, ptr %31, align 8, !tbaa !3
  %35 = add i64 %.0421432, 1
  br label %36

36:                                               ; preds = %32, %34
  %.1423 = phi i64 [ %33, %32 ], [ %.0422431, %34 ]
  %.1 = phi i64 [ %.0421432, %32 ], [ %35, %34 ]
  %37 = add i64 %.0433, 1
  %38 = icmp sle i64 %.1423, %12
  %39 = icmp sle i64 %.1, %5
  %40 = and i1 %38, %39
  br i1 %40, label %20, label %._crit_edge

._crit_edge:                                      ; preds = %36, %4
  %.0.lcssa430 = phi i64 [ 1, %4 ], [ %37, %36 ]
  %.0422.lcssa = phi i64 [ %6, %4 ], [ %.1423, %36 ]
  %.0421.lcssa = phi i64 [ %13, %4 ], [ %.1, %36 ]
  %41 = icmp sgt i64 %.0421.lcssa, %5
  %42 = add nuw i64 %9, 1
  %43 = sub i64 %42, %.0.lcssa430
  %.not446 = icmp slt i64 %43, 1
  br i1 %41, label %44, label %69

44:                                               ; preds = %._crit_edge
  br i1 %.not446, label %.loopexit, label %.lr.ph440

.lr.ph440:                                        ; preds = %44
  %45 = add i64 %.0422.lcssa, -1
  %46 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %47 = load i64, ptr %46, align 8, !tbaa !7
  %48 = load ptr, ptr %0, align 8, !tbaa !7
  %49 = add i64 %.0.lcssa430, 2305843009213693951
  %xtraiter454 = and i64 %43, 1
  %50 = icmp eq i64 %9, %.0.lcssa430
  br i1 %50, label %.loopexit.loopexit.unr-lcssa, label %.lr.ph440.new

.lr.ph440.new:                                    ; preds = %.lr.ph440
  %unroll_iter457 = and i64 %43, -2
  br label %51

51:                                               ; preds = %51, %.lr.ph440.new
  %52 = phi i64 [ 0, %.lr.ph440.new ], [ %61, %51 ]
  %niter458 = phi i64 [ 0, %.lr.ph440.new ], [ %niter458.next.1, %51 ]
  %53 = or i64 %52, 1
  %54 = add i64 %45, %52
  %55 = mul i64 %47, %54
  %56 = getelementptr i8, ptr %48, i64 %55
  %57 = load i64, ptr %56, align 8, !tbaa !3
  %58 = add i64 %49, %52
  %59 = shl i64 %58, 3
  %60 = getelementptr i8, ptr %11, i64 %59
  store i64 %57, ptr %60, align 8, !tbaa !3
  %61 = add nuw nsw i64 %52, 2
  %62 = add i64 %45, %53
  %63 = mul i64 %47, %62
  %64 = getelementptr i8, ptr %48, i64 %63
  %65 = load i64, ptr %64, align 8, !tbaa !3
  %66 = add i64 %49, %53
  %67 = shl i64 %66, 3
  %68 = getelementptr i8, ptr %11, i64 %67
  store i64 %65, ptr %68, align 8, !tbaa !3
  %niter458.next.1 = add i64 %niter458, 2
  %niter458.ncmp.1 = icmp eq i64 %niter458.next.1, %unroll_iter457
  br i1 %niter458.ncmp.1, label %.loopexit.loopexit.unr-lcssa, label %51

69:                                               ; preds = %._crit_edge
  br i1 %.not446, label %.loopexit, label %.lr.ph438

.lr.ph438:                                        ; preds = %69
  %70 = add i64 %.0421.lcssa, -1
  %71 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %72 = load i64, ptr %71, align 8, !tbaa !7
  %73 = load ptr, ptr %0, align 8, !tbaa !7
  %74 = add i64 %.0.lcssa430, 2305843009213693951
  %xtraiter = and i64 %43, 1
  %75 = icmp eq i64 %9, %.0.lcssa430
  br i1 %75, label %.loopexit.loopexit452.unr-lcssa, label %.lr.ph438.new

.lr.ph438.new:                                    ; preds = %.lr.ph438
  %unroll_iter = and i64 %43, -2
  br label %76

76:                                               ; preds = %76, %.lr.ph438.new
  %77 = phi i64 [ 0, %.lr.ph438.new ], [ %86, %76 ]
  %niter = phi i64 [ 0, %.lr.ph438.new ], [ %niter.next.1, %76 ]
  %78 = or i64 %77, 1
  %79 = add i64 %70, %77
  %80 = mul i64 %72, %79
  %81 = getelementptr i8, ptr %73, i64 %80
  %82 = load i64, ptr %81, align 8, !tbaa !3
  %83 = add i64 %74, %77
  %84 = shl i64 %83, 3
  %85 = getelementptr i8, ptr %11, i64 %84
  store i64 %82, ptr %85, align 8, !tbaa !3
  %86 = add nuw nsw i64 %77, 2
  %87 = add i64 %70, %78
  %88 = mul i64 %72, %87
  %89 = getelementptr i8, ptr %73, i64 %88
  %90 = load i64, ptr %89, align 8, !tbaa !3
  %91 = add i64 %74, %78
  %92 = shl i64 %91, 3
  %93 = getelementptr i8, ptr %11, i64 %92
  store i64 %90, ptr %93, align 8, !tbaa !3
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.loopexit.loopexit452.unr-lcssa, label %76

.loopexit.loopexit.unr-lcssa:                     ; preds = %51, %.lr.ph440
  %.unr455 = phi i64 [ 0, %.lr.ph440 ], [ %61, %51 ]
  %lcmp.mod456.not = icmp eq i64 %xtraiter454, 0
  br i1 %lcmp.mod456.not, label %.loopexit, label %.loopexit.loopexit.epilog-lcssa

.loopexit.loopexit.epilog-lcssa:                  ; preds = %.loopexit.loopexit.unr-lcssa
  %94 = add i64 %45, %.unr455
  %95 = mul i64 %47, %94
  %96 = getelementptr i8, ptr %48, i64 %95
  %97 = load i64, ptr %96, align 8, !tbaa !3
  %98 = add i64 %49, %.unr455
  %99 = shl i64 %98, 3
  %100 = getelementptr i8, ptr %11, i64 %99
  store i64 %97, ptr %100, align 8, !tbaa !3
  br label %.loopexit

.loopexit.loopexit452.unr-lcssa:                  ; preds = %76, %.lr.ph438
  %.unr = phi i64 [ 0, %.lr.ph438 ], [ %86, %76 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.loopexit, label %.loopexit.loopexit452.epilog-lcssa

.loopexit.loopexit452.epilog-lcssa:               ; preds = %.loopexit.loopexit452.unr-lcssa
  %101 = add i64 %70, %.unr
  %102 = mul i64 %72, %101
  %103 = getelementptr i8, ptr %73, i64 %102
  %104 = load i64, ptr %103, align 8, !tbaa !3
  %105 = add i64 %74, %.unr
  %106 = shl i64 %105, 3
  %107 = getelementptr i8, ptr %11, i64 %106
  store i64 %104, ptr %107, align 8, !tbaa !3
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit452.epilog-lcssa, %.loopexit.loopexit452.unr-lcssa, %.loopexit.loopexit.epilog-lcssa, %.loopexit.loopexit.unr-lcssa, %69, %44
  %.not445 = icmp slt i64 %8, 1
  br i1 %.not445, label %._crit_edge443, label %.lr.ph442

.lr.ph442:                                        ; preds = %.loopexit
  %108 = add i64 %6, -1
  %109 = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %0, i64 0, i32 7, i64 0, i64 2
  %110 = load i64, ptr %109, align 8, !tbaa !7
  %111 = load ptr, ptr %0, align 8, !tbaa !7
  %xtraiter460 = and i64 %9, 1
  %112 = icmp eq i64 %9, 1
  br i1 %112, label %._crit_edge443.loopexit.unr-lcssa, label %.lr.ph442.new

.lr.ph442.new:                                    ; preds = %.lr.ph442
  %unroll_iter463 = and i64 %9, 9223372036854775806
  br label %113

113:                                              ; preds = %113, %.lr.ph442.new
  %114 = phi i64 [ 0, %.lr.ph442.new ], [ %125, %113 ]
  %niter464 = phi i64 [ 0, %.lr.ph442.new ], [ %niter464.next.1, %113 ]
  %115 = shl i64 %114, 3
  %116 = getelementptr i8, ptr %11, i64 %115
  %117 = load i64, ptr %116, align 8, !tbaa !3
  %118 = or i64 %114, 1
  %119 = add i64 %108, %114
  %120 = mul i64 %110, %119
  %121 = getelementptr i8, ptr %111, i64 %120
  store i64 %117, ptr %121, align 8, !tbaa !3
  %122 = shl i64 %118, 3
  %123 = getelementptr i8, ptr %11, i64 %122
  %124 = load i64, ptr %123, align 8, !tbaa !3
  %125 = add nuw nsw i64 %114, 2
  %126 = add i64 %108, %118
  %127 = mul i64 %110, %126
  %128 = getelementptr i8, ptr %111, i64 %127
  store i64 %124, ptr %128, align 8, !tbaa !3
  %niter464.next.1 = add i64 %niter464, 2
  %niter464.ncmp.1 = icmp eq i64 %niter464.next.1, %unroll_iter463
  br i1 %niter464.ncmp.1, label %._crit_edge443.loopexit.unr-lcssa, label %113

._crit_edge443.loopexit.unr-lcssa:                ; preds = %113, %.lr.ph442
  %.unr461 = phi i64 [ 0, %.lr.ph442 ], [ %125, %113 ]
  %lcmp.mod462.not = icmp eq i64 %xtraiter460, 0
  br i1 %lcmp.mod462.not, label %._crit_edge443, label %._crit_edge443.loopexit.epilog-lcssa

._crit_edge443.loopexit.epilog-lcssa:             ; preds = %._crit_edge443.loopexit.unr-lcssa
  %129 = shl i64 %.unr461, 3
  %130 = getelementptr i8, ptr %11, i64 %129
  %131 = load i64, ptr %130, align 8, !tbaa !3
  %132 = add i64 %108, %.unr461
  %133 = mul i64 %110, %132
  %134 = getelementptr i8, ptr %111, i64 %133
  store i64 %131, ptr %134, align 8, !tbaa !3
  br label %._crit_edge443

._crit_edge443:                                   ; preds = %._crit_edge443.loopexit.epilog-lcssa, %._crit_edge443.loopexit.unr-lcssa, %.loopexit
  tail call void @free(ptr %11)
  ret void
}

; Function Attrs: nofree norecurse nosync nounwind memory(argmem: read)
define i64 @_QFPpow_fast(i64 %0, i64 %1, ptr nocapture readonly %2) local_unnamed_addr #3 {
  %4 = icmp ne i64 %0, 1
  %5 = icmp sgt i64 %1, 0
  %or.cond = and i1 %4, %5
  br i1 %or.cond, label %.preheader, label %.loopexit

.preheader:                                       ; preds = %3
  %6 = load i64, ptr %2, align 8, !tbaa !3
  br label %7

7:                                                ; preds = %.preheader, %12
  %.012 = phi i64 [ %14, %12 ], [ %0, %.preheader ]
  %.011 = phi i64 [ %15, %12 ], [ %1, %.preheader ]
  %.0 = phi i64 [ %.1, %12 ], [ 1, %.preheader ]
  %8 = and i64 %.011, 1
  %.not = icmp eq i64 %8, 0
  br i1 %.not, label %12, label %9

9:                                                ; preds = %7
  %10 = mul i64 %.0, %.012
  %11 = srem i64 %10, %6
  br label %12

12:                                               ; preds = %9, %7
  %.1 = phi i64 [ %11, %9 ], [ %.0, %7 ]
  %13 = mul i64 %.012, %.012
  %14 = srem i64 %13, %6
  %15 = lshr i64 %.011, 1
  %.old1.not = icmp ult i64 %.011, 2
  br i1 %.old1.not, label %.loopexit, label %7

.loopexit:                                        ; preds = %12, %3
  %.2 = phi i64 [ 1, %3 ], [ %.1, %12 ]
  ret i64 %.2
}

declare ptr @_FortranAioBeginExternalListInput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioInputInteger(ptr, ptr, i32) local_unnamed_addr

declare i32 @_FortranAioEndIoStatement(ptr) local_unnamed_addr

declare i1 @_FortranAioInputDescriptor(ptr, ptr) local_unnamed_addr

declare ptr @_FortranAioBeginExternalListOutput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputInteger64(ptr, i64) local_unnamed_addr

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smax.i64(i64, i64) #4

attributes #0 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #1 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #2 = { nounwind }
attributes #3 = { nofree norecurse nosync nounwind memory(argmem: read) }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

!llvm.module.flags = !{!0, !1, !2}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!4, !4, i64 0}
!4 = !{!"any data access", !5, i64 0}
!5 = !{!"any access", !6, i64 0}
!6 = !{!"Flang Type TBAA Root"}
!7 = !{!8, !8, i64 0}
!8 = !{!"descriptor member", !5, i64 0}
