#![allow(unused_imports, unused_macros, unknown_lints)]

macro_rules! dump {($($e:expr), +) => {println!(concat!($(stringify!($e), " = {:?}\n"), +), $($e), +)}}
macro_rules! max {($e0:expr, $($e:expr), +) => {{let mut r = $e0; $(r = max(r, $e);)+ r}}}
macro_rules! min {($e0:expr, $($e:expr), +) => {{let mut r = $e0; $(r = min(r, $e);)+ r}}}
macro_rules! freq {($v:expr) => {{let mut h = HashMap::new(); for x in $v {*h.entry(x).or_insert(0) += 1} h}}}

use std::collections::*;
use std::f64::*;
use std::cmp::*;
use std::cmp::Ordering::*;

fn main() {
  let n = get::val::<usize>();
  let xs = get::vals::<isize>(n);
  let ys = get::vals::<isize>(n); 
  
  let mut xys = xs.into_iter().map(|x|x+1).chain(ys.into_iter().map(|y|-(y+1))).collect::<Vec<_>>();
  xys.sort_by(|x,y|x.abs().cmp(&y.abs()));
  
  let mut pos = 0;
  let mut neg = 0;
  let mut ans = 1;
  for obj in xys {
    match (obj.signum(), pos, neg) {
      ( 1,_,0) => {pos += 1},
      ( 1,_,_) => {ans = modulo::mul(ans,neg); neg -= 1},
      (-1,0,_) => {neg += 1},
      (-1,_,_) => {ans = modulo::mul(ans,pos); pos -= 1},
      _        => unreachable!()
    }
  }
  
  println!("{}", ans)
}

#[allow(dead_code)]
mod modulo {
  pub const MOD: usize = 1_000_000_007;

  pub fn add(x: usize, y: usize) -> usize {
    (x + y) % MOD
  }

  pub fn sum(xs: &[usize]) -> usize {
    xs.iter().fold(0,|a,&x|add(a,x))
  }

  pub fn mul(x: usize, y: usize) -> usize {
    (x * y) % MOD
  }

  pub fn product(xs: &[usize]) -> usize {
    xs.iter().fold(1,|a,&x|mul(a,x))
  }

  pub fn pow(x: usize, n: usize) -> usize {
    match n {
      0 => 1,
      _ if n % 2 == 1 => mul(x, pow(x, n-1)),
      _ => {
        let q = pow(x, n>>1);
        mul(q, q)
      }
    }
  }
}
  
#[allow(dead_code)]
mod get {
  use std::io::*;
  use std::str::*;
  use std::process::*;

  pub fn val<T: FromStr>() -> T {
    let mut buf = String::new();
    let s = stdin();
    s.lock().read_line(&mut buf).ok();
    if buf.is_empty() {println!("No input"); exit(0)}
    buf.trim_right().parse::<T>().ok().unwrap()
  }

  pub fn vals<T: FromStr>(n: usize) -> Vec<T> {
    let mut vec: Vec<T> = vec![];
    for _ in 0 .. n {
      vec.push(val());
    }
    vec
  }

  pub fn tuple<T1: FromStr, T2: FromStr>() -> (T1, T2) {
    let mut buf = String::new();
    let s = stdin();
    s.lock().read_line(&mut buf).ok();
    if buf.is_empty() {println!("No input"); exit(0)}
    let mut it = buf.trim_right().split_whitespace();
    let x = it.next().unwrap().parse::<T1>().ok().unwrap();
    let y = it.next().unwrap().parse::<T2>().ok().unwrap();
    (x, y)
  }

  pub fn tuples<T1: FromStr, T2: FromStr>(n: usize) -> Vec<(T1, T2)> {
    let mut vec: Vec<(T1, T2)> = vec![];
    for _ in 0 .. n {
      vec.push(tuple());
    }
    vec
  }

  pub fn tuple3<T1: FromStr, T2: FromStr, T3: FromStr>() -> (T1, T2, T3) {
    let mut buf = String::new();
    let s = stdin();
    s.lock().read_line(&mut buf).ok();
    if buf.is_empty() {println!("No input"); exit(0)}
    let mut it = buf.trim_right().split_whitespace();
    let x = it.next().unwrap().parse::<T1>().ok().unwrap();
    let y = it.next().unwrap().parse::<T2>().ok().unwrap();
    let z = it.next().unwrap().parse::<T3>().ok().unwrap();
    (x, y, z)
  }

  pub fn tuple3s<T1: FromStr, T2: FromStr, T3: FromStr>(n: usize) -> Vec<(T1, T2, T3)> {
    let mut vec: Vec<(T1, T2, T3)> = vec![];
    for _ in 0 .. n {
      vec.push(tuple3());
    }
    vec
  }

  pub fn vec<T: FromStr>() -> Vec<T> {
    let mut buf = String::new();
    let s = stdin();
    s.lock().read_line(&mut buf).ok();
    if buf.is_empty() {println!("No input"); exit(0)}
    buf.trim_right().split_whitespace().map(|t| t.parse::<T>().ok().unwrap()).collect()
  }

  pub fn mat<T: FromStr>(h: usize) -> Vec<Vec<T>> {
    let mut mat = vec![];
    for _ in 0 .. h {
      mat.push(vec());
    }
    mat
  }

  pub fn chars() -> Vec<char> {
    let mut buf = String::new();
    let s = stdin();
    s.lock().read_line(&mut buf).ok();
    if buf.is_empty() {println!("No input"); exit(0)}
    buf.trim_right().chars().collect()
  }
}

#[allow(dead_code)]
mod put {
  use std::string::*;

  pub fn vec<T: ToString>(vec: &Vec<T>, sep: &str) {
    let out = vec.iter().map(|e| e.to_string()).collect::<Vec<_>>().as_slice().join(sep);
    println!("{}", out);
  }

  pub fn mat<T: ToString>(mat: &Vec<Vec<T>>, sep: &str) {
    for v in mat {
      vec(v, sep);
    }
  }
}



Measured memory_bytes: 8444