/*
for (int i = 0; i < N; ++i){}

// 各桁の和を計算する関数
int findSumOfDigits(int n) {
  int sum = 0;
  while (n > 0) { // n が 0 になるまで
    sum += n % 10;
    n /= 10;
  }
  return sum;
}

sort(a, a + N, greater<int>());  // a[0:N] を大きい順にソート

int num[110] = {0};  // バケット
for (int i = 0; i < N; ++i) {
    num[d[i]]++;  // d[i] が 1 個増える
}

map<string, int> mp; // 連想配列 map<キー型, 値型> オブジェクト名
for (int i = 0; i < N; ++i) {
    auto itr = mp.find(s[i]);        // s[i] が設定されているか？
    if(itr != mp.end() ) {
         mp[s[i]] += 1;
    }
    else {
         mp[s[i]] += 1 ;
    }
}
stack<int> s;	//intをデータとするスタックを用意
s.push(1);		//{} -> {1}
printf("%d\n", s.top());	// 3
s.pop();

queue<int> que;	//intをデータとするキューを用意
que.push(1);		//{} -> {1}
printf("%d\n", que.front());	// 1
que.pop();
*/
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>

using namespace std;

// #define for(i,a,b) for (int i=(a);i<(b);++i)
typedef long long ll;
typedef pair<int,int> point;
#define rep(i,n) for(i,0,n)
 
int main() {
	// 入力
	int T;
	cin >> T;
	ll A[T], B[T], C[T], D[T];
	for (int i = 0; i < T; ++i) cin >> A[i] >> B[i] >> C[i] >> D[i];
 
	// 解法
	for (int i = 0; i < T; ++i){
		bool ans;
		if (A[i]<B[i]) ans = false; // 初回でアウト
		else if (B[i]>D[i]) ans = false; // 消費が常に勝る
		else if (B[i]<C[i]) ans = true; // stock=Bになる前に必ず補充する
		else{
			int threshold = B[i] - C[i];
			int K = __gcd(B[i], D[i]);
			int AmodK = A[i]%K;
			int CmodK = C[i]%K;
			// cout <<"AmodK " << AmodK <<" CmodK " << CmodK << " ";
			
			if (threshold>K) ans = false;
			else if (CmodK<AmodK) ans = false;
			// else if (AmodK<=C[i]) ans = true;
			// else if (AmodK>threshold) ans = false;
			else ans = true;
		}
		if (ans) printf("Yes\n");
		else printf("No\n");
	}
}
 
