#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef long double db;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define pll pair<ll,ll>
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define ub(v,val) upper_bound(v.begin(),v.end(),val)
#define np(str) next_permutation(str.begin(),str.end())
#define lb(v,val) lower_bound(v.begin(),v.end(),val)
#define sortv(vec) sort(vec.begin(),vec.end())
#define rev(p) reverse(p.begin(),p.end());
#define v vector
#define len length()
#define repc(i,s,e) for(ll i=s;i<e;i++)
#define fi first
#define se second
#define mset(a,val) memset(a,val,sizeof(a));
#define mt make_tuple
#define repr(i,n) for(i=n-1;i>=0;i--)
#define rep(i,n) for(i=0;i<n;i++)
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define at(s,pos) *(s.find_by_order(pos))
#define set_ind(s,val) s.order_of_key(val)
long long int M = 1e9 + 7 ;
long long int inf = 9 * 1e18;
const double PI = acos(-1);
//CLOCK
ll begtime = clock();
#define time() cout << "\n\nTime elapsed: " << (clock() - begtime)*1000/CLOCKS_PER_SEC << " ms\n\n";
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//CLOCK ENDED
ll n, m;
// modular exponentiation
ll binpow(ll val, ll deg)
{
	if (deg < 0)
		return 0;
	if (!deg)
		return 1 % M;
	if (deg & 1)
		return binpow(val, deg - 1) * val % M;
	ll res = binpow(val, deg >> 1);
	return (res * res) % M;
}
//binomial
ll modinv(ll n) {
	return binpow(n, M - 2);
}



int main() {
	// your code goes here
	IOS;
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	ll i, j, t, k, x, y, z,  N;
	cin >> n;
	ll a[n];
	rep(i, n) {
		cin >> a[i];
	}
	ll sum = 0;

	ll dp[n + 1][2];
	mset(dp, 0);
	dp[0][0] = 1;
	for (int i = 1; i <= n; i++) {
		dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % M;
		dp[i][1] = dp[i - 1][0];
	}
	//0 for +
	//1 for -

	// cout << dp[2][0] << ' ' << dp[2][1];
	rep(i, n) {


		ll prod1 = (dp[i][0] * (dp[n - 1 - i][0] + dp[n - 1 - i][1])) % M;
		ll prod2 = dp[i][1];
		if (n - 2 - i >= 0)
			prod2 = (prod2 * (dp[n - 2 - i][0] + dp[n - 2 - i][1])) % M;

		// cout << prod2 << '\n';

		(sum += (a[i] * prod1)) %= M;
		(sum -= a[i] * prod2) %= M;
		if (sum < 0) sum += M;


	}
	cout << sum;
	return 0;



}





















#include <iostream>
#include <string>
#include <sstream>
#include <iomanip> 
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <bitset>

using namespace std;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimization("unroll-loops, no-stack-protector")
//#pragma GCC target("avx,avx2,fma")


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	long long n, i, j, k, s, MOD = 1000000007, ans;
	cin >> n;
	vector<long long> a(n);
	for (i = 0; i < n; i++) cin >> a[i];

	vector<long long> dp(n, 0), dp2(n, 0);
	vector<long long> dpc(n, 0), dpc2(n, 0);

	dp[0] = a[0];
	dpc[0] = 1;

	for (i = 1; i < n; i++) {
		dpc[i] = (dpc[i - 1] + dpc2[i - 1]) % MOD;
		dp[i] = (dp[i - 1] + dp2[i - 1] + a[i] * (dpc[i - 1] + dpc2[i - 1])) % MOD;

		dpc2[i] = dpc[i - 1];
		dp2[i] = (dp[i - 1] - a[i] * dpc[i - 1] + MOD * MOD) % MOD;
	}

	ans = (dp[n - 1] + dp2[n - 1]) % MOD;
	cout << ans << "\n";

	return 0;
}
