import os

import sys



# from libs.debug import debug



if os.getenv("LOCAL"):

    sys.stdin = open("_in.txt", "r")



sys.setrecursionlimit(10 ** 9)

INF = float("inf")

IINF = 10 ** 18

MOD = 10 ** 9 + 7

# MOD = 998244353





N = int(sys.stdin.buffer.readline())

C = list(map(int, sys.stdin.buffer.readline().split()))

C.sort(reverse=True)





def div_mod(a, b, mod):

    return a * pow(b, mod - 2, mod) % mod





# (1+x)^k = kC0 * x^0 + kC1 * x^1 + kC2 * x^2 + ... + kCk * x^k

# (1+x)^k * x = kC0 * x^1 + kC1 * x^2 + kC2 * x^3 + ... + kCk * x^(k+1)

# 微分して x=1 を代入すると、上から1番目からk番目になる通り数 * D の総和になる

# kC0 * 1 + kC1 * 2 + kC2 * 3 + ... + kCk * (k+1)

def df(k):

    # (1+x)^x * x を微分した値を返す。

    # https://mathtrain.jp/composite

    # http://w3e.kanazawa-it.ac.jp/math/category/bibun/keisan/diff-gh.html

    # f(x) = 1+x

    # g(x) = x^k

    # h(x) = x

    # g(f(x)) * h(x) = (1+x)^k * x

    # f'(x) = 1

    # g'(x) = kx^(k-1)

    # h'(x) = 1

    # g'(f(x)) = g'(f(x)) * f'(x) = k(1+x)^(k-1)

    # (g(f(x)) * h(x))' = g'(f(x)) * h(x) + g(f(x)) * h'(x)

    #                   = k(1+x)^(k-1) + (1+x)^k

    # (g(f(1)) * h(1))' = k * 2^(k-1) + 2^k

    #                   = k * 2^k / 2 + 2^k

    #                   = (k + 2) / 2 * 2^k

    return div_mod((k + 2) * pow(2, k, MOD), 2, MOD)





ans = 0

for k in range(N):

    # k までの選び方 * 上から何番目か * C[k] * k より後ろの選び方

    ans += df(k) * C[k] * pow(2, N - k - 1, MOD)

    ans %= MOD

print((ans * pow(2, N, MOD) % MOD))

import os

import sys



if os.getenv("LOCAL"):

    sys.stdin = open("_in.txt", "r")



sys.setrecursionlimit(10 ** 9)

INF = float("inf")

IINF = 10 ** 18

MOD = 10 ** 9 + 7

# MOD = 998244353





N = int(sys.stdin.buffer.readline())

C = list(map(int, sys.stdin.buffer.readline().split()))

C.sort(reverse=True)



assert pow(2, MOD - 2, MOD) == 500000004





def div2(a):

    return a % MOD * 500000004 % MOD





pow2 = [1]

for _ in range(N):

    pow2.append(pow2[-1] * 2 % MOD)





# (1+x)^k = kC0 * x^0 + kC1 * x^1 + kC2 * x^2 + ... + kCk * x^k

# (1+x)^k * x = kC0 * x^1 + kC1 * x^2 + kC2 * x^3 + ... + kCk * x^(k+1)

# 微分して x=1 を代入すると、上から1番目からk番目になる通り数 * D の総和になる

# kC0 * 1 + kC1 * 2 + kC2 * 3 + ... + kCk * (k+1)

def df(k):

    # a(x) = (1+x)^k * x として、a'(1) を返す。

    # https://mathtrain.jp/composite

    # http://w3e.kanazawa-it.ac.jp/math/category/bibun/keisan/diff-gh.html

    # f(x) = 1+x

    # g(x) = x^k

    # h(x) = x

    # g(f(x)) * h(x) = (1+x)^k * x

    # f'(x) = 1

    # g'(x) = kx^(k-1)

    # h'(x) = 1

    # g'(f(x)) = g'(f(x)) * f'(x) = k(1+x)^(k-1)

    # (g(f(x)) * h(x))' = g'(f(x)) * h(x) + g(f(x)) * h'(x)

    #                   = k(1+x)^(k-1) + (1+x)^k

    # (g(f(1)) * h(1))' = k * 2^(k-1) + 2^k

    #                   = k * 2^k / 2 + 2^k

    #                   = (k + 2) / 2 * 2^k

    return div2((k + 2) * pow2[k])





ans = 0

for k in range(N):

    # k までの選び方 * 上から何番目か * C[k] * k より後ろの選び方

    ans += df(k) * C[k] * pow2[N - k - 1]

    ans %= MOD

print((ans * pow2[N] % MOD))

import os
import sys

# from libs.debug import debug
if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")
sys.setrecursionlimit(10**9)
INF = float("inf")
IINF = 10**18
MOD = 10**9 + 7
# MOD = 998244353
N = int(sys.stdin.buffer.readline())
C = list(map(int, sys.stdin.buffer.readline().split()))
C.sort(reverse=True)


def div_mod(a, b, mod):
    return a * pow(b, mod - 2, mod) % mod


# (1+x)^k = kC0 * x^0 + kC1 * x^1 + kC2 * x^2 + ... + kCk * x^k
# (1+x)^k * x = kC0 * x^1 + kC1 * x^2 + kC2 * x^3 + ... + kCk * x^(k+1)
# 微分して x=1 を代入すると、上から1番目からk番目になる通り数 * D の総和になる
# kC0 * 1 + kC1 * 2 + kC2 * 3 + ... + kCk * (k+1)
def df(k):
    # (1+x)^x * x を微分した値を返す。
    # https://mathtrain.jp/composite
    # http://w3e.kanazawa-it.ac.jp/math/category/bibun/keisan/diff-gh.html
    # f(x) = 1+x
    # g(x) = x^k
    # h(x) = x
    # g(f(x)) * h(x) = (1+x)^k * x
    # f'(x) = 1
    # g'(x) = kx^(k-1)
    # h'(x) = 1
    # g'(f(x)) = g'(f(x)) * f'(x) = k(1+x)^(k-1)
    # (g(f(x)) * h(x))' = g'(f(x)) * h(x) + g(f(x)) * h'(x)
    #                   = k(1+x)^(k-1) + (1+x)^k
    # (g(f(1)) * h(1))' = k * 2^(k-1) + 2^k
    #                   = k * 2^k / 2 + 2^k
    #                   = (k + 2) / 2 * 2^k
    return div_mod((k + 2) * pow(2, k, MOD), 2, MOD)


ans = 0
for k in range(N):
    # k までの選び方 * 上から何番目か * C[k] * k より後ろの選び方
    ans += df(k) * C[k] * pow(2, N - k - 1, MOD)
    ans %= MOD
print((ans * pow(2, N, MOD) % MOD))

import os
import sys

if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")
sys.setrecursionlimit(10**9)
INF = float("inf")
IINF = 10**18
MOD = 10**9 + 7
# MOD = 998244353
N = int(sys.stdin.buffer.readline())
C = list(map(int, sys.stdin.buffer.readline().split()))
C.sort(reverse=True)
assert pow(2, MOD - 2, MOD) == 500000004


def div2(a):
    return a % MOD * 500000004 % MOD


pow2 = [1]
for _ in range(N):
    pow2.append(pow2[-1] * 2 % MOD)
# (1+x)^k = kC0 * x^0 + kC1 * x^1 + kC2 * x^2 + ... + kCk * x^k
# (1+x)^k * x = kC0 * x^1 + kC1 * x^2 + kC2 * x^3 + ... + kCk * x^(k+1)
# 微分して x=1 を代入すると、上から1番目からk番目になる通り数 * D の総和になる
# kC0 * 1 + kC1 * 2 + kC2 * 3 + ... + kCk * (k+1)
def df(k):
    # a(x) = (1+x)^k * x として、a'(1) を返す。
    # https://mathtrain.jp/composite
    # http://w3e.kanazawa-it.ac.jp/math/category/bibun/keisan/diff-gh.html
    # f(x) = 1+x
    # g(x) = x^k
    # h(x) = x
    # g(f(x)) * h(x) = (1+x)^k * x
    # f'(x) = 1
    # g'(x) = kx^(k-1)
    # h'(x) = 1
    # g'(f(x)) = g'(f(x)) * f'(x) = k(1+x)^(k-1)
    # (g(f(x)) * h(x))' = g'(f(x)) * h(x) + g(f(x)) * h'(x)
    #                   = k(1+x)^(k-1) + (1+x)^k
    # (g(f(1)) * h(1))' = k * 2^(k-1) + 2^k
    #                   = k * 2^k / 2 + 2^k
    #                   = (k + 2) / 2 * 2^k
    return div2((k + 2) * pow2[k])


ans = 0
for k in range(N):
    # k までの選び方 * 上から何番目か * C[k] * k より後ろの選び方
    ans += df(k) * C[k] * pow2[N - k - 1]
    ans %= MOD
print((ans * pow2[N] % MOD))

-# from libs.debug import debug +assert pow(2, MOD - 2, MOD) == 500000004 -def div_mod(a, b, mod): -    return a * pow(b, mod - 2, mod) % mod +def div2(a): +    return a % MOD * 500000004 % MOD +pow2 = [1] +for _ in range(N): +    pow2.append(pow2[-1] * 2 % MOD) -    # (1+x)^x * x を微分した値を返す。 +    # a(x) = (1+x)^k * x として、a'(1) を返す。 -    return div_mod((k + 2) * pow(2, k, MOD), 2, MOD) +    return div2((k + 2) * pow2[k]) -    ans += df(k) * C[k] * pow(2, N - k - 1, MOD) +    ans += df(k) * C[k] * pow2[N - k - 1] -print((ans * pow(2, N, MOD) % MOD)) +print((ans * pow2[N] % MOD))