#include <bits/stdc++.h>
using LL = long long;
using namespace std;


template<typename Type, typename Operators>
struct AlgStruct {

    Type x;

    template<typename... Args> AlgStruct(Args... args) : x(args...) {}

    template<typename... Args>
        decltype(auto) operator[](Args... args) { return x.operator[](args...); }


    AlgStruct& operator=(const AlgStruct& value) & = default;

    template<typename... Args>
        static AlgStruct id_add(Args... args) { return Operators::IdAdd(args...); }

    template<typename... Args>
        static AlgStruct id_mul(Args... args) { return Operators::IdMul(args...); }

    AlgStruct operator+() const { return *this; }
    AlgStruct operator-() const { return Operators::Opposite(x); }
    AlgStruct reciprocal() const { return Operators::Reciprocal(x); }

    AlgStruct operator+=(const AlgStruct& rhs) { x = Operators::Add(x, rhs.x); return *this; }
    AlgStruct operator-=(const AlgStruct& rhs) { *this += -rhs; return *this; }
    AlgStruct operator*=(const AlgStruct& rhs) { x = Operators::Mul(x, rhs.x); return *this; }
    AlgStruct operator/=(const AlgStruct& rhs) { return *this *= rhs.reciprocal(); }

    const AlgStruct operator+(const AlgStruct& rhs) const { return AlgStruct(*this) += rhs; }
    const AlgStruct operator-(const AlgStruct& rhs) const { return AlgStruct(*this) -= rhs; }
    const AlgStruct operator*(const AlgStruct& rhs) const { return AlgStruct(*this) *= rhs; }
    const AlgStruct operator/(const AlgStruct& rhs) const { return AlgStruct(*this) /= rhs; }

    AlgStruct power(LL n) const { return Operators::Power(x, n); }

    bool operator<(const AlgStruct& rhs) const { return Operators::Less(x, rhs.x); }
    bool operator>(const AlgStruct& rhs) const { return rhs < *this; }
    bool operator<=(const AlgStruct& rhs) const { return !(*this > rhs); }
    bool operator>=(const AlgStruct& rhs) const { return !(*this < rhs); }
    bool operator==(const AlgStruct& rhs) const { return !(*this < rhs) && !(*this > rhs); }
    bool operator!=(const AlgStruct& rhs) const { return !(*this == rhs); }
};

template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator+(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) + rhs;
}
template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator-(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) - rhs;
}
template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator*(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) * rhs;
}
template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator/(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) / rhs;
}

template<typename Type, typename Operators>
bool operator<(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) < rhs;
}
template<typename Type, typename Operators>
bool operator>(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) > rhs;
}
template<typename Type, typename Operators>
bool operator<=(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) <= rhs;
}
template<typename Type, typename Operators>
bool operator>=(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) >= rhs;
}
template<typename Type, typename Operators>
bool operator==(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) == rhs;
}
template<typename Type, typename Operators>
bool operator!=(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) != rhs;
}

template<typename Type, typename Operators>
auto& operator<<(ostream& s,const AlgStruct<Type, Operators>& a){ s << a.x; return s; }


template<LL mod>
struct GaloisFieldOperators {
    static LL Add(LL lhs, LL rhs) { return (lhs + rhs) % mod; };
    static LL Mul(LL lhs, LL rhs) { return (lhs * rhs) % mod; };
    static LL IdAdd() { return 0; };
    static LL IdMul() { return 1; };
    static LL Opposite(LL value) { return ((-value % mod) + mod) % mod; };
    static bool Less(LL lhs, LL rhs) { return lhs < rhs; };
    static LL Power(LL value, LL n) {
        LL res = IdMul();
        while (n > 0) {
            if (n & 1) res = Mul(res, value);
            value = Mul(value, value); n >>= 1;
        }
        return res;
    }
    static LL Reciprocal(LL value) { return Power(value, mod-2); }
};

const LL MOD = 1e9+7;

using GaloisField = AlgStruct<LL, GaloisFieldOperators<MOD>>;


template<typename Ring>
struct Frac {
    vector<Ring> frac;
    Frac(int n) {
        frac.resize(n+1);
        frac[0] = 1;
        for (int i = 1; i <= n; ++i) {
            frac[i] = frac[i-1] * i;
        }
    }
    Ring operator[](int i) {
        return frac[i];
    }
};

template<typename Field>
struct Comb {
    Frac<Field> frac;
    Comb(int n) : frac(n) {}
    Field operator()(int n, int r) {
        if (n < 0 || n-r < 0 || r < 0) {
            return 0;
        }
        return frac[n] / (frac[n-r] * frac[r]);
    }
};

signed main()
{
    LL n; cin >> n;

    Frac<GaloisField> frac(n);
    Comb<GaloisField> comb(n);

    vector<GaloisField> num(n);

    for (int k = 1; k <= n-1; ++k) {
        num[k] = comb(k-1, n-1-k) * frac[k] * frac[n-1-k];
    }

    GaloisField ans = 0;

    for (LL k = 1; k <= n-1; ++k) {
        ans += (num[k] - num[k-1]) * k;
    }

    cout << ans << endl;

    return 0;
}


Measured memory_bytes: 23680