#include <bits/stdc++.h>   using namespace std;   const int MOD = 1000000007;   inline void add(int &a, int b, int md = MOD) {     a += b;     if (a >= md) {       a -= md;     }   }   inline int mul(int a, int b, int md = MOD) { return (long long)a * b % md; }   inline int power(int a, int b, int md = MOD) {     int res = 1;     while (b > 0) {       if (b & 1) {         res = mul(res, a, md);       }       a = mul(a, a, md);       b >>= 1;     }     return res;   }   inline int inv(int x) { return power(x, MOD - 2); }   struct node {     int value;     int len;   };   node seq(int n7, int n6, int k) {     int p10k = power(10, k);     int t = mul(p10k, 10);     int e = n6 - power(10, k, MOD - 1) + 1;     if (e < 0) {       e += MOD - 1;     }     int it1 = inv(t - 1);     int sum = mul(power(t, e) + MOD - 1, it1);     int z = mul(p10k, sum);     int res = z;     int cnt = n7 - p10k + 1;     if (cnt < 0) {       cnt += MOD;     }     add(res, mul(sum - cnt + MOD, it1));     return {res, mul(e, k + 1, MOD - 1)};   }   node concat(node a, node b) {     int value = mul(a.value, power(10, b.len));     add(value, b.value);     return {value, (a.len + b.len) % (MOD - 1)};   }   node multi(node a, int b) {     if (b == 1) {       return a;     }     if (b % 2 == 1) {       return concat(multi(a, b - 1), a);     }     node z = multi(a, b / 2);     return concat(z, z);   }   const int N = 100010;   node prec[N];   node big_seq(int n7, int n6, int k) {     node res = seq(n7, n6, k - 1);     for (int i = k - 2; i >= 0; i--) {       res = concat(prec[i], res);     }     return res;   }   char s[N];   int pos;   node solve_exp() {     int start = pos;     int v7 = 0;     int v6 = 0;     while ( 0  <= s[pos] && s[pos] <=  9 ) {       v7 = mul(v7, 10);       add(v7, s[pos] -  0 );       v6 = mul(v6, 10, MOD - 1);       add(v6, s[pos] -  0 , MOD - 1);       pos++;     }     int len_v = pos - start;     if (s[pos] ==  + ) {       pos++;       return concat({v7, len_v}, solve_exp());     }     if (s[pos] ==  - ) {       pos++;       int start2 = pos, w7 = 0, w6 = 0;       while ( 0  <= s[pos] && s[pos] <=  9 ) {         w7 = mul(w7, 10);         add(w7, s[pos] -  0 );         w6 = mul(w6, 10, MOD - 1);         add(w6, s[pos] -  0 , MOD - 1);         pos++;       }       int len_w = pos - start2;       add(v7, MOD - 1);       add(v6, (MOD - 1) - 1, MOD - 1);       node v = big_seq(v7, v6, len_v);       node w = big_seq(w7, w6, len_w);       int diff = w.len - v.len;       if (diff < 0) {         diff += MOD - 1;       }       int real_value = w.value;       add(real_value, MOD - mul(v.value, power(10, diff)));       int real_len = w.len;       add(real_len, (MOD - 1) - v.len, MOD - 1);       if (s[pos] ==  + ) {         pos++;         return concat({real_value, real_len}, solve_exp());       }       return {real_value, real_len};     }     if (s[pos] ==  ( ) {       int finish = pos;       pos++;       node z = solve_exp();       node res = {0, 0};       for (int i = start; i < finish; i++) {         res = multi(res, 10);         if (s[i] !=  0 ) {           res = concat(res, multi(z, s[i] -  0 ));         }       }       pos++;       if (s[pos] ==  + ) {         pos++;         return concat(res, solve_exp());       }       return res;     }     return {v7, len_v};   }   int main() {     int v7 = 0;     int v6 = 0;     for (int k = 0; k < N; k++) {       v7 = mul(v7, 10);       add(v7, 9);       v6 = mul(v6, 10, MOD - 1);       add(v6, 9, MOD - 1);       prec[k] = seq(v7, v6, k);     }     scanf( %s , s);     pos = 0;     node res = solve_exp();     printf( %d n , res.value);     return 0;   }