fix(fs): fix cached read

related to: #3968
This commit is contained in:
Gabor Kiss-Vamosi
2023-02-28 21:22:01 +01:00
parent 746e26fd52
commit 77836dd260
2 changed files with 68 additions and 22 deletions

View File

@@ -138,10 +138,10 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
char * buffer = file_p->cache->buffer;
uint16_t buffer_size = file_p->drv->cache_size;
if(start <= file_position && file_position < end) {
if(start <= file_position && file_position <= end) {
/* Data can be read from cache buffer */
uint16_t buffer_offset = file_position - start;
uint32_t buffer_remaining_length = LV_MIN((uint32_t)buffer_size - buffer_offset, (uint32_t)end - file_position);
uint32_t buffer_remaining_length = (uint32_t)end - file_position + 1;
uint16_t buffer_offset = (end - start) - buffer_remaining_length + 1;
if(btr <= buffer_remaining_length) {
/*Data is in cache buffer, and buffer end not reached, no need to read from FS*/
@@ -152,7 +152,7 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
/*First part of data is in cache buffer, but we need to read rest of data from FS*/
lv_memcpy(buf, buffer + buffer_offset, buffer_remaining_length);
file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position + buffer_remaining_length,
file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->end + 1,
LV_FS_SEEK_SET);
uint32_t bytes_read_to_buffer = 0;
@@ -164,8 +164,8 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
else {
/*If remaining data chunk is smaller than buffer size, then read into cache buffer*/
res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer);
file_p->cache->start = file_p->cache->end;
file_p->cache->end = file_p->cache->start + bytes_read_to_buffer;
file_p->cache->start = file_p->cache->end + 1;
file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1;
uint16_t data_chunk_remaining = LV_MIN(btr - buffer_remaining_length, bytes_read_to_buffer);
lv_memcpy(buf + buffer_remaining_length, buffer, data_chunk_remaining);
@@ -174,6 +174,9 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
}
}
else {
file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position,
LV_FS_SEEK_SET);
/*Data is not in cache buffer*/
if(btr > buffer_size) {
/*If bigger data is requested, then do not use cache, instead read it directly*/
@@ -187,10 +190,12 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t
buffer = file_p->cache->buffer;
}
uint32_t bytes_read_to_buffer = 0;
res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer);
file_p->cache->start = file_position;
file_p->cache->end = file_p->cache->start + bytes_read_to_buffer;
file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1;
*br = LV_MIN(btr, bytes_read_to_buffer);
lv_memcpy(buf, buffer, *br);
@@ -262,7 +267,7 @@ lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whenc
file_p->cache->file_position = pos;
/*FS seek if new position is outside cache buffer*/
if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position >= file_p->cache->end) {
if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position > file_p->cache->end) {
res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET);
}
@@ -272,7 +277,7 @@ lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whenc
file_p->cache->file_position += pos;
/*FS seek if new position is outside cache buffer*/
if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position >= file_p->cache->end) {
if(file_p->cache->file_position < file_p->cache->start || file_p->cache->file_position > file_p->cache->end) {
res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET);
}

View File

@@ -10,7 +10,7 @@ const char * read_exp =
static void read_range(lv_fs_file_t * f, uint32_t from, uint32_t to);
static void read_random_drv(char drv_letter);
static void read_random_drv(char drv_letter, uint32_t cache_size);
void setUp(void)
{
@@ -67,8 +67,17 @@ void test_read(void)
void test_read_random(void)
{
read_random_drv('A');
read_random_drv('B');
read_random_drv('A', 8);
read_random_drv('B', 8);
read_random_drv('A', 32);
read_random_drv('B', 32);
read_random_drv('A', 128);
read_random_drv('B', 128);
read_random_drv('A', 1024);
read_random_drv('B', 1024);
}
/**
@@ -92,11 +101,26 @@ static void read_range(lv_fs_file_t * f, uint32_t from, uint32_t to)
}
}
static void read_random_drv(char drv_letter)
static void read_next(lv_fs_file_t * f, uint32_t from, uint32_t len)
{
uint8_t buf_rd[256];
uint32_t br;
lv_fs_read(f, buf_rd, len, &br);
TEST_ASSERT_EQUAL(br, len);
uint32_t i;
for(i = 0; i < br; i++) {
TEST_ASSERT_EQUAL(buf_rd[i], from + i);
}
}
static void read_random_drv(char drv_letter, uint32_t cache_size)
{
/*Hack to force a small cache size*/
lv_fs_drv_t * drv = lv_fs_get_drv(drv_letter);
drv->cache_size = 32;
uint32_t original_cache_size = drv->cache_size;
drv->cache_size = cache_size;
char fn[64];
lv_snprintf(fn, sizeof(fn), "%c:fs_read_random.bin", drv_letter);
@@ -120,22 +144,39 @@ static void read_random_drv(char drv_letter)
TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
// *INDENT-OFF*
static const uint8_t ranges[1000][2] = {
{74, 109}, {16, 84}, {105, 172}, {70, 135}, {70, 143}, {20, 85}, {123, 230}, {1, 6}, {105, 204}, {106, 113}, {73, 154}, {31, 131}, {122, 125}, {18, 74}, {123, 238}, {2, 111}, {72, 110}, {122, 138}, {118, 166}, {110, 207}, {106, 180}, {80, 164}, {105, 171}, {102, 212}, {110, 118}, {40, 107}, {38, 122}, {68, 147}, {51, 163}, {79, 195}, {27, 126}, {76, 90}, {110, 124}, {109, 195}, {14, 47}, {97, 192}, {122, 188}, {75, 153}, {7, 44}, {11, 56}, {69, 181}, {75, 139}, {34, 157}, {16, 94}, {97, 158}, {127, 175}, {87, 210}, {66, 132}, {49, 159}, {74, 199}, {60, 176}, {31, 112}, {52, 150}, {50, 88}, {61, 85}, {56, 127}, {72, 149}, {113, 227}, {111, 190}, {15, 73}, {23, 71}, {8, 43}, {28, 145}, {68, 115}, {84, 162}, {108, 193}, {26, 96}, {8, 133}, {123, 229}, {114, 217}, {17, 36}, {101, 156}, {120, 181}, {48, 159}, {0, 8}, {22, 129}, {101, 221}, {113, 229}, {114, 180}, {75, 128}, {83, 144}, {120, 169}, {128, 204}, {88, 108}, {19, 55}, {33, 33}, {86, 98}, {3, 26}, {72, 145}, {87, 147}, {0, 62}, {16, 52}, {42, 167}, {71, 176}, {119, 188}, {27, 78}, {86, 94}, {23, 41}, {52, 107}, {3, 100}, {121, 153}, {64, 110}, {92, 94}, {107, 203}, {72, 175}, {72, 75}, {90, 108}, {62, 84}, {29, 72}, {27, 137}, {111, 137}, {116, 176}, {57, 106}, {48, 169}, {6, 60}, {127, 250}, {37, 50}, {48, 100}, {3, 79}, {11, 28}, {70, 132}, {37, 137}, {69, 139}, {75, 160}, {60, 156}, {29, 140}, {103, 224}, {82, 88}, {76, 110}, {115, 200}, {37, 54}, {26, 118}, {56, 90}, {73, 94}, {3, 119}, {76, 186}, {64, 97}, {62, 129}, {97, 136}, {75, 93}, {83, 176}, {81, 198}, {5, 58}, {26, 82}, {16, 89}, {123, 127}, {67, 158}, {59, 114}, {70, 74}, {105, 162}, {94, 130}, {18, 73}, {68, 154}, {110, 130}, {93, 202}, {29, 71}, {10, 110}, {29, 48}, {90, 94}, {31, 118}, {102, 179}, {90, 114}, {76, 194}, {41, 142}, {40, 156}, {36, 97}, {119, 149},
{81, 127}, {37, 76}, {74, 191}, {46, 67}, {35, 37}, {51, 160}, {85, 173}, {110, 206}, {108, 222}, {98, 202}, {118, 118}, {123, 233}, {77, 196}, {48, 102}, {20, 133}, {110, 163}, {93, 191}, {56, 101}, {109, 235}, {33, 83}, {8, 113}, {99, 125}, {2, 21}, {50, 154}, {104, 154}, {68, 174}, {36, 118}, {99, 191}, {72, 118}, {86, 171}, {72, 112}, {102, 146}, {48, 120}, {14, 74}, {41, 69}, {99, 198}, {0, 65}, {1, 89}, {97, 184}, {121, 190}, {128, 202}, {104, 140}, {10, 53}, {122, 159}, {122, 178}, {112, 121}, {14, 58}, {34, 76}, {66, 135}, {27, 93}, {73, 85}, {13, 36}, {124, 177}, {78, 105}, {10, 55}, {39, 73}, {90, 137}, {59, 129}, {119, 124}, {103, 195}, {41, 149}, {11, 124}, {46, 89}, {125, 175}, {20, 94}, {99, 136}, {91, 157}, {74, 137}, {4, 9}, {82, 98}, {29, 150}, {106, 205}, {21, 62}, {26, 122}, {80, 152}, {20, 115}, {56, 169}, {8, 63}, {115, 121}, {27, 110}, {128, 250}, {58, 70}, {0, 32}, {30, 154}, {83, 210}, {115, 192}, {85, 176}, {21, 116}, {69, 79}, {58, 101}, {19, 136}, {32, 93}, {37, 98}, {25, 51}, {31, 145}, {49, 160}, {95, 195}, {120, 138}, {4, 12}, {3, 65}, {6, 84}, {17, 43}, {10, 105}, {85, 193}, {41, 140}, {118, 209}, {127, 231}, {96, 140}, {16, 53}, {97, 212}, {65, 111}, {86, 200}, {55, 158}, {30, 46}, {48, 104}, {1, 117}, {80, 135}, {73, 90}, {90, 167}, {13, 74}, {114, 130}, {69, 196}, {111, 160}, {7, 70}, {51, 102}, {15, 112}, {2, 81}, {43, 114}, {9, 79}, {110, 146}, {71, 89}, {93, 139}, {76, 99}, {54, 171}, {110, 224}, {9, 127}, {56, 70}, {17, 64}, {83, 196}, {41, 130}, {64, 73}, {21, 83}, {92, 203}, {22, 42}, {102, 141}, {59, 108}, {104, 165}, {121, 223}, {18, 29}, {95, 107}, {90, 126}, {24, 53}, {4, 83}, {19, 53}, {47, 156}, {69, 126}, {28, 75}, {82, 143}, {3, 67}, {69, 112}, {2, 15}, {55, 159}, {92, 103}, {70, 187}, {36, 127}, {100, 123}, {30, 106}, {87, 168},
{111, 124}, {50, 132}, {93, 122}, {41, 129}, {83, 178}, {19, 130}, {80, 171}, {20, 126}, {23, 39}, {12, 37}, {107, 117}, {26, 110}, {23, 135}, {30, 34}, {49, 88}, {55, 106}, {25, 118}, {78, 190}, {95, 114}, {34, 118}, {121, 154}, {57, 106}, {111, 182}, {124, 158}, {118, 135}, {30, 113}, {54, 153}, {49, 135}, {59, 133}, {66, 92}, {123, 207}, {6, 76}, {113, 237}, {97, 173}, {114, 199}, {97, 151}, {26, 26}, {52, 97}, {87, 180}, {111, 231}, {42, 62}, {97, 156}, {51, 136}, {52, 63}, {48, 143}, {125, 249}, {71, 168}, {105, 119}, {4, 93}, {124, 148}, {100, 190}, {114, 186}, {69, 97}, {7, 97}, {50, 161}, {69, 95}, {90, 196}, {95, 143}, {121, 186}, {104, 201}, {30, 92}, {124, 205}, {58, 140}, {42, 87}, {58, 115}, {90, 103}, {34, 146}, {66, 139}, {103, 181}, {63, 188}, {11, 53}, {61, 105}, {76, 179}, {34, 36}, {47, 158}, {34, 121}, {88, 189}, {24, 87}, {36, 76}, {125, 251}, {66, 192}, {8, 127}, {34, 59}, {62, 167}, {19, 62}, {115, 213}, {75, 137}, {106, 135}, {75, 158}, {26, 134}, {110, 125}, {111, 172}, {42, 149}, {38, 108}, {115, 224}, {20, 134}, {111, 120}, {111, 184}, {37, 111}, {112, 233}, {126, 142}, {75, 158}, {41, 145}, {34, 121}, {18, 122}, {120, 209}, {28, 100}, {51, 134}, {45, 98}, {114, 157}, {93, 143}, {31, 38}, {11, 21}, {89, 95}, {70, 120}, {68, 189}, {41, 53}, {111, 140}, {95, 120}, {73, 191}, {61, 81}, {32, 124}, {58, 112}, {25, 109}, {122, 245}, {96, 154}, {51, 167}, {58, 85}, {94, 175}, {86, 110}, {21, 143}, {12, 87}, {10, 12}, {58, 144}, {125, 148}, {110, 145}, {87, 163}, {99, 188}, {32, 41}, {59, 135}, {61, 161}, {96, 152}, {25, 131}, {70, 128}, {39, 132}, {31, 157}, {79, 95}, {81, 97}, {44, 114}, {4, 96}, {128, 222}, {27, 131}, {71, 83}, {61, 94}, {57, 178}, {91, 170}, {45, 134}, {31, 76}, {50, 66}, {102, 156}, {7, 50}, {114, 131}, {78, 179}, {77, 133}, {45, 161},
{72, 140}, {87, 119}, {44, 50}, {43, 56}, {78, 147}, {58, 174}, {70, 155}, {91, 138}, {89, 114}, {102, 199}, {113, 181}, {103, 223}, {119, 182}, {81, 152}, {30, 37}, {98, 199}, {34, 119}, {96, 206}, {74, 150}, {86, 207}, {127, 142}, {77, 177}, {49, 161}, {106, 140}, {33, 139}, {25, 48}, {61, 162}, {51, 87}, {122, 187}, {91, 202}, {97, 162}, {14, 102}, {80, 114}, {117, 202}, {123, 151}, {82, 116}, {31, 87}, {120, 175}, {21, 143}, {127, 211}, {112, 202}, {8, 54}, {80, 86}, {90, 216}, {111, 198}, {124, 213}, {31, 52}, {95, 147}, {51, 130}, {72, 96}, {85, 203}, {36, 65}, {75, 161}, {44, 115}, {61, 123}, {90, 211}, {39, 47}, {72, 134}, {75, 139}, {86, 87}, {124, 185}, {57, 87}, {1, 44}, {30, 49}, {105, 158}, {116, 172}, {58, 94}, {31, 138}, {65, 123}, {58, 96}, {80, 86}, {25, 138}, {6, 82}, {71, 155}, {102, 222}, {77, 173}, {126, 138}, {75, 162}, {77, 149}, {44, 98}, {92, 120}, {111, 193}, {112, 226}, {27, 64}, {100, 114}, {122, 165}, {83, 208}, {12, 138}, {54, 177}, {46, 109}, {28, 95}, {18, 40}, {113, 177}, {39, 132}, {110, 130}, {52, 165}, {39, 96}, {115, 135}, {101, 170}, {83, 161}, {75, 121}, {11, 44}, {88, 206}, {5, 66}, {88, 122}, {39, 112}, {99, 206}, {78, 79}, {109, 130}, {7, 91}, {3, 117}, {96, 135}, {54, 97}, {45, 130}, {7, 63}, {65, 174}, {116, 142}, {42, 44}, {80, 207}, {89, 178}, {28, 110}, {100, 177}, {53, 127}, {110, 159}, {102, 151}, {99, 197}, {89, 163}, {3, 104}, {125, 200}, {103, 227}, {115, 190}, {122, 141}, {128, 255}, {14, 100}, {23, 120}, {13, 119}, {31, 101}, {94, 157}, {10, 137}, {88, 214}, {2, 48}, {113, 134}, {10, 114}, {85, 164}, {3, 62}, {87, 207}, {87, 180}, {13, 79}, {99, 177}, {6, 30}, {62, 78}, {119, 136}, {23, 129}, {53, 82}, {55, 64}, {8, 93}, {101, 193}, {110, 231}, {9, 128}, {93, 119}, {23, 26}, {121, 189}, {2, 39}, {27, 53}, {111, 211}, {49, 100},
{92, 200}, {30, 89}, {34, 85}, {38, 126}, {6, 114}, {122, 145}, {48, 148}, {64, 129}, {3, 115}, {77, 124}, {82, 201}, {85, 210}, {56, 119}, {128, 209}, {87, 101}, {36, 56}, {97, 139}, {85, 149}, {6, 14}, {39, 43}, {69, 91}, {11, 87}, {91, 128}, {81, 103}, {86, 156}, {15, 80}, {2, 99}, {15, 36}, {124, 166}, {108, 136}, {107, 192}, {104, 227}, {7, 50}, {30, 94}, {39, 96}, {126, 173}, {121, 183}, {84, 119}, {121, 233}, {48, 58}, {121, 135}, {95, 211}, {97, 180}, {3, 59}, {38, 124}, {113, 164}, {34, 96}, {9, 29}, {29, 72}, {100, 128}, {104, 224}, {60, 187}, {39, 133}, {27, 105}, {28, 142}, {97, 150}, {68, 151}, {116, 171}, {1, 105}, {83, 123}, {54, 171}, {70, 142}, {118, 150}, {32, 85}, {124, 138}, {98, 165}, {13, 29}, {40, 149}, {59, 111}, {112, 191}, {67, 118}, {84, 211}, {108, 141}, {118, 153}, {21, 120}, {26, 29}, {85, 133}, {119, 162}, {12, 121}, {50, 151}, {64, 126}, {13, 92}, {19, 39}, {69, 189}, {66, 68}, {122, 172}, {4, 88}, {127, 220}, {128, 164}, {116, 206}, {50, 75}, {38, 88}, {113, 137}, {60, 132}, {16, 24}, {61, 63}, {20, 25}, {12, 24}, {110, 112}, {49, 105}, {29, 114}, {13, 66}, {87, 181}, {39, 104}, {89, 132}, {106, 194}, {81, 132}, {20, 102}, {119, 237}, {59, 103}, {24, 107}, {96, 181}, {87, 195}, {79, 87}, {17, 93}, {2, 98}, {89, 137}, {120, 178}, {81, 206}, {100, 131}, {39, 131}, {101, 189}, {38, 127}, {100, 148}, {62, 62}, {18, 54}, {29, 120}, {69, 96}, {112, 155}, {46, 74}, {88, 111}, {84, 186}, {47, 105}, {96, 187}, {84, 89}, {0, 43}, {114, 121}, {57, 77}, {66, 177}, {78, 114}, {80, 138}, {0, 97}, {13, 18}, {17, 65}, {8, 13}, {61, 168}, {34, 96}, {119, 242}, {99, 189}, {4, 99}, {114, 230}, {104, 148}, {60, 109}, {106, 215}, {113, 190}, {74, 80}, {16, 77}, {17, 77}, {87, 97}, {98, 180}, {116, 152}, {49, 138}, {68, 192}, {110, 223}, {115, 157}, {34, 52}, {76, 125},
{62, 140}, {17, 39}, {71, 142}, {54, 72}, {80, 152}, {38, 47}, {82, 94}, {116, 196}, {122, 172}, {14, 54}, {3, 123}, {52, 118}, {126, 221}, {117, 143}, {88, 140}, {61, 163}, {14, 35}, {30, 35}, {61, 81}, {116, 218}, {19, 130}, {114, 169}, {54, 131}, {81, 101}, {61, 154}, {115, 238}, {70, 144}, {89, 201}, {64, 157}, {82, 209}, {121, 196}, {117, 158}, {59, 82}, {89, 131}, {18, 82}, {56, 96}, {11, 27}, {113, 180}, {35, 136}, {113, 213}, {36, 93}, {95, 159}, {54, 83}, {2, 80}, {74, 176}, {8, 11}, {33, 50}, {19, 144}, {34, 114}, {107, 166}, {54, 180}, {8, 73}, {68, 77}, {98, 179}, {5, 41}, {52, 74}, {3, 78}, {19, 123}, {109, 184}, {17, 95}, {97, 106}, {76, 175}, {73, 188}, {15, 43}, {111, 113}, {9, 70}, {52, 171}, {10, 116}, {8, 121}, {112, 126}, {119, 141}, {116, 225}, {49, 87}, {87, 89}, {83, 183}, {24, 112}, {79, 206}, {22, 28}, {103, 193}, {106, 142}, {92, 136}, {17, 29}, {19, 61}, {81, 153}, {54, 163}, {61, 137}, {0, 59}, {76, 84}, {20, 77}, {37, 124}, {23, 111}, {39, 118}, {54, 74}, {127, 203}, {76, 188}, {11, 82}, {30, 69}, {56, 124}, {25, 140}, {14, 40}, {127, 223}, {51, 95}, {75, 104}, {18, 111}, {8, 99}, {76, 78}, {80, 158}, {1, 127}, {100, 122}, {101, 110}, {97, 139}, {28, 35}, {120, 142}, {3, 7}, {99, 140}, {83, 190}, {95, 132}, {94, 188}, {53, 69}, {9, 54}, {65, 161}, {102, 198}, {87, 199}, {48, 51}, {7, 84}, {46, 99}, {106, 111}, {40, 142}, {123, 163}, {65, 176}, {31, 136}, {119, 124}, {4, 10}, {125, 248}, {52, 93}, {30, 80}, {25, 60}, {18, 129}, {29, 72}, {55, 179}, {99, 102}, {100, 213}, {53, 76}, {86, 122}, {71, 194}, {14, 61}, {26, 136}, {98, 103}, {65, 97}, {64, 103}, {10, 121}, {113, 235}, {125, 216}, {120, 196}, {81, 125}, {37, 57}, {123, 153}, {80, 191}, {113, 201}, {27, 98}, {68, 98}, {109, 151}, {80, 197}, {72, 169}, {27, 45}, {116, 143}, {93, 185},
static const uint8_t ranges[1000][4] = {
/*{from, to, next_read_cnt, next_read_cnt}*/
{34, 36, 31, 13}, {40, 55, 40, 19}, {75, 92, 31, 1}, {80, 91, 19, 31}, {121, 141, 5, 22}, {8, 23, 21, 39}, {33, 37, 5, 34}, {71, 90, 22, 37}, {111, 124, 14, 38}, {2, 15, 6, 16}, {109, 129, 14, 13}, {85, 97, 10, 24}, {79, 90, 31, 32}, {8, 23, 4, 1}, {13, 21, 9, 15}, {90, 95, 2, 21}, {77, 95, 17, 28}, {60, 75, 26, 13}, {115, 117, 19, 24}, {31, 46, 9, 17}, {81, 98, 8, 32}, {115, 121, 33, 2}, {25, 31, 34, 23}, {26, 42, 16, 26}, {105, 121, 30, 16}, {82, 99, 26, 3}, {83, 87, 37, 6}, {33, 43, 34, 36}, {35, 51, 18, 30}, {29, 34, 20, 31}, {25, 36, 21, 23}, {123, 125, 40, 16}, {12, 30, 35, 14}, {80, 94, 19, 19}, {94, 112, 19, 13}, {113, 117, 15, 20}, {39, 53, 19, 14}, {38, 49, 29, 16}, {56, 63, 3, 7}, {128, 140, 8, 7}, {112, 115, 5, 16}, {68, 87, 24, 34}, {88, 95, 18, 12}, {4, 20, 18, 29}, {4, 8, 10, 32}, {33, 43, 28, 3}, {67, 80, 10, 13}, {74, 86, 14, 8}, {78, 98, 12, 26}, {86, 92, 24, 34}, {63, 66, 12, 30}, {117, 119, 40, 37}, {90, 97, 23, 11}, {95, 107, 39, 40}, {67, 74, 6, 34}, {128, 133, 11, 22}, {98, 99, 12, 25}, {91, 110, 5, 15}, {33, 37, 13, 32}, {12, 32, 3, 34}, {100, 102, 5, 25}, {52, 63, 37, 31}, {108, 125, 39, 7}, {77, 81, 28, 27}, {36, 54, 9, 29}, {109, 126, 12, 29}, {61, 70, 28, 19}, {47, 66, 9, 25}, {66, 69, 3, 17}, {75, 89, 26, 5}, {89, 103, 22, 15}, {113, 133, 34, 28}, {113, 114, 32, 33}, {124, 141, 9, 33}, {79, 85, 30, 28}, {60, 61, 30, 9}, {39, 54, 9, 18}, {93, 104, 35, 17}, {112, 122, 15, 6}, {104, 116, 1, 3}, {60, 62, 29, 9}, {119, 132, 40, 22}, {54, 70, 15, 14}, {8, 20, 24, 30}, {18, 29, 24, 1}, {104, 120, 15, 23}, {15, 25, 16, 32}, {45, 54, 14, 16}, {75, 79, 1, 38}, {52, 59, 15, 19}, {109, 128, 35, 38}, {85, 89, 7, 33}, {5, 6, 26, 32}, {12, 16, 32, 39}, {85, 105, 30, 4}, {88, 103, 37, 31}, {88, 104, 21, 23}, {18, 31, 5, 32}, {35, 50, 7, 5}, {3, 4, 3, 3}, {105, 120, 7, 3},
{21, 37, 21, 23}, {75, 93, 4, 39}, {3, 10, 6, 40}, {90, 107, 1, 23}, {100, 115, 37, 11}, {99, 107, 18, 14}, {127, 135, 11, 33}, {63, 74, 27, 14}, {96, 108, 3, 14}, {64, 76, 19, 3}, {67, 84, 15, 34}, {82, 91, 15, 22}, {34, 44, 14, 36}, {107, 114, 15, 31}, {120, 130, 31, 33}, {126, 134, 25, 31}, {58, 78, 11, 14}, {124, 127, 19, 13}, {114, 129, 13, 12}, {111, 128, 9, 40}, {127, 134, 9, 23}, {128, 131, 39, 7}, {62, 65, 28, 29}, {87, 104, 38, 17}, {13, 29, 24, 37}, {124, 133, 20, 24}, {63, 64, 28, 32}, {59, 69, 17, 8}, {12, 13, 1, 25}, {64, 78, 14, 25}, {49, 69, 20, 36}, {96, 105, 10, 8}, {29, 31, 27, 11}, {67, 83, 37, 2}, {89, 96, 2, 6}, {23, 27, 7, 1}, {87, 93, 13, 9}, {25, 43, 1, 26}, {81, 93, 12, 39}, {62, 68, 13, 32}, {114, 133, 6, 19}, {10, 21, 2, 25}, {94, 102, 24, 12}, {13, 29, 2, 26}, {110, 111, 14, 10}, {120, 123, 17, 1}, {121, 135, 31, 16}, {120, 127, 3, 34}, {74, 79, 32, 24}, {120, 138, 16, 13}, {121, 133, 25, 20}, {87, 101, 33, 31}, {79, 89, 27, 39}, {48, 60, 20, 35}, {43, 63, 9, 30}, {8, 27, 39, 13}, {77, 83, 30, 29}, {109, 116, 24, 5}, {122, 139, 4, 34}, {74, 82, 1, 22}, {98, 118, 20, 4}, {30, 34, 9, 25}, {98, 99, 37, 35}, {105, 108, 17, 4}, {84, 103, 19, 8}, {116, 133, 28, 40}, {53, 70, 27, 23}, {91, 93, 40, 8}, {116, 124, 21, 30}, {66, 68, 11, 32}, {91, 109, 27, 27}, {74, 83, 3, 17}, {57, 60, 22, 12}, {7, 15, 37, 16}, {93, 106, 6, 22}, {104, 106, 30, 20}, {56, 73, 9, 38}, {105, 110, 5, 19}, {122, 134, 30, 37}, {71, 83, 25, 26}, {68, 85, 21, 28}, {126, 140, 10, 29}, {87, 93, 38, 14}, {68, 82, 31, 20}, {26, 41, 8, 32}, {52, 55, 17, 13}, {51, 60, 31, 14}, {122, 126, 30, 26}, {32, 43, 3, 22}, {76, 93, 28, 24}, {97, 117, 12, 21}, {9, 17, 36, 21}, {52, 71, 24, 5}, {123, 138, 14, 21}, {82, 84, 9, 17}, {32, 34, 40, 24}, {89, 99, 21, 15}, {16, 32, 19, 9}, {39, 48, 38, 6}, {125, 129, 18, 31},
{28, 37, 21, 15}, {70, 77, 35, 31}, {107, 127, 18, 31}, {118, 125, 3, 23}, {89, 97, 28, 25}, {78, 96, 21, 40}, {19, 20, 9, 21}, {25, 38, 19, 35}, {63, 83, 2, 34}, {39, 58, 37, 1}, {52, 63, 1, 33}, {110, 120, 10, 16}, {84, 87, 31, 22}, {10, 22, 32, 22}, {84, 87, 39, 21}, {61, 70, 12, 22}, {118, 132, 4, 30}, {41, 50, 19, 36}, {3, 5, 40, 2}, {122, 123, 4, 28}, {121, 139, 25, 38}, {49, 69, 32, 13}, {60, 78, 32, 24}, {26, 32, 36, 19}, {54, 71, 15, 7}, {70, 76, 17, 37}, {15, 32, 15, 40}, {37, 52, 22, 22}, {46, 47, 20, 27}, {90, 91, 37, 23}, {104, 123, 4, 31}, {111, 129, 1, 33}, {25, 45, 21, 36}, {1, 21, 29, 25}, {104, 123, 33, 26}, {1, 3, 17, 20}, {63, 77, 14, 5}, {48, 55, 29, 19}, {126, 137, 29, 32}, {83, 91, 1, 36}, {120, 123, 22, 18}, {42, 57, 27, 9}, {106, 114, 8, 20}, {101, 107, 14, 36}, {52, 58, 11, 26}, {16, 22, 39, 27}, {107, 120, 35, 31}, {21, 37, 9, 11}, {110, 128, 35, 5}, {65, 83, 39, 39}, {13, 18, 10, 9}, {95, 96, 37, 8}, {94, 96, 14, 2}, {85, 87, 25, 7}, {27, 38, 1, 34}, {15, 25, 21, 27}, {87, 92, 18, 24}, {34, 44, 10, 19}, {123, 140, 31, 35}, {40, 48, 14, 2}, {63, 80, 14, 22}, {104, 109, 9, 39}, {109, 121, 36, 22}, {43, 53, 26, 36}, {117, 127, 15, 15}, {27, 31, 34, 32}, {30, 41, 2, 11}, {89, 102, 40, 16}, {107, 124, 22, 19}, {104, 117, 33, 22}, {10, 26, 21, 32}, {51, 58, 11, 34}, {87, 98, 27, 25}, {99, 116, 36, 35}, {103, 114, 4, 34}, {109, 121, 25, 8}, {114, 126, 6, 6}, {47, 66, 31, 14}, {115, 125, 39, 34}, {27, 29, 15, 7}, {103, 109, 12, 5}, {109, 111, 21, 39}, {83, 84, 7, 2}, {63, 67, 2, 37}, {14, 15, 35, 10}, {43, 56, 25, 27}, {74, 93, 2, 22}, {59, 79, 2, 18}, {56, 70, 39, 16}, {116, 128, 40, 38}, {14, 24, 6, 26}, {103, 106, 18, 29}, {128, 146, 7, 21}, {63, 83, 32, 33}, {109, 116, 26, 16}, {85, 89, 10, 5}, {116, 129, 17, 37}, {97, 116, 26, 7}, {98, 100, 40, 13}, {94, 109, 24, 32},
{105, 118, 7, 40}, {37, 45, 18, 18}, {65, 77, 34, 18}, {47, 59, 30, 21}, {4, 6, 35, 16}, {34, 47, 17, 38}, {81, 97, 17, 9}, {80, 88, 38, 8}, {118, 123, 34, 19}, {82, 93, 24, 18}, {82, 101, 21, 17}, {67, 72, 18, 27}, {117, 121, 20, 21}, {107, 119, 16, 11}, {19, 36, 13, 29}, {39, 56, 40, 20}, {14, 22, 24, 6}, {31, 32, 24, 39}, {46, 52, 36, 3}, {70, 80, 1, 27}, {108, 112, 2, 35}, {81, 89, 26, 35}, {66, 72, 15, 23}, {46, 63, 23, 22}, {96, 104, 4, 4}, {23, 27, 17, 12}, {84, 88, 11, 21}, {79, 98, 26, 8}, {38, 52, 1, 5}, {125, 141, 39, 27}, {112, 121, 33, 3}, {103, 109, 8, 16}, {96, 106, 31, 16}, {74, 87, 14, 31}, {96, 113, 2, 28}, {107, 113, 23, 30}, {64, 83, 33, 13}, {79, 92, 6, 29}, {80, 82, 35, 10}, {28, 34, 11, 4}, {123, 137, 40, 30}, {107, 119, 36, 34}, {114, 132, 9, 28}, {100, 114, 35, 22}, {123, 131, 33, 10}, {83, 92, 22, 19}, {29, 34, 15, 14}, {104, 110, 40, 26}, {7, 27, 34, 38}, {29, 39, 35, 1}, {87, 102, 10, 25}, {117, 126, 31, 40}, {62, 71, 4, 25}, {4, 18, 11, 28}, {41, 54, 25, 13}, {41, 60, 40, 31}, {122, 138, 19, 26}, {117, 123, 35, 34}, {10, 21, 33, 1}, {60, 64, 27, 38}, {55, 58, 34, 39}, {51, 56, 36, 12}, {101, 119, 13, 14}, {90, 91, 18, 12}, {74, 87, 3, 24}, {45, 59, 8, 19}, {60, 74, 24, 33}, {84, 87, 11, 38}, {107, 116, 16, 20}, {58, 70, 12, 34}, {99, 103, 26, 26}, {62, 73, 32, 33}, {68, 81, 7, 12}, {106, 122, 37, 27}, {109, 110, 11, 32}, {89, 94, 21, 17}, {98, 108, 3, 40}, {77, 94, 24, 34}, {17, 36, 34, 30}, {65, 70, 8, 7}, {31, 38, 1, 36}, {28, 43, 15, 5}, {107, 111, 13, 8}, {31, 49, 18, 35}, {50, 55, 3, 24}, {4, 16, 24, 19}, {35, 40, 40, 30}, {117, 130, 35, 20}, {33, 38, 9, 37}, {3, 5, 40, 38}, {18, 35, 30, 15}, {65, 70, 40, 16}, {121, 136, 13, 6}, {3, 21, 3, 20}, {41, 54, 14, 37}, {51, 67, 4, 1}, {80, 82, 8, 28}, {12, 21, 35, 30}, {75, 91, 19, 14}, {96, 99, 31, 13},
{45, 46, 35, 30}, {39, 57, 11, 17}, {104, 109, 7, 39}, {126, 135, 18, 25}, {55, 74, 16, 39}, {21, 37, 29, 24}, {22, 29, 36, 3}, {38, 41, 14, 34}, {52, 59, 35, 27}, {110, 125, 20, 28}, {33, 48, 38, 1}, {23, 34, 13, 38}, {55, 60, 33, 23}, {71, 76, 16, 1}, {22, 28, 16, 22}, {43, 50, 35, 16}, {91, 96, 40, 21}, {100, 119, 39, 22}, {64, 66, 29, 32}, {95, 98, 21, 30}, {61, 77, 12, 7}, {46, 52, 3, 13}, {108, 121, 35, 14}, {9, 15, 25, 9}, {41, 60, 24, 20}, {4, 23, 5, 29}, {29, 31, 2, 10}, {58, 62, 38, 6}, {40, 60, 8, 29}, {41, 54, 5, 25}, {99, 108, 5, 33}, {56, 57, 11, 18}, {94, 95, 9, 28}, {34, 37, 13, 40}, {128, 140, 39, 35}, {101, 110, 5, 4}, {41, 45, 31, 11}, {58, 72, 9, 24}, {48, 54, 24, 35}, {10, 21, 6, 12}, {38, 58, 11, 4}, {2, 22, 18, 9}, {6, 15, 22, 7}, {74, 94, 18, 14}, {75, 84, 29, 29}, {20, 40, 32, 39}, {8, 22, 20, 12}, {116, 136, 32, 40}, {20, 26, 8, 24}, {96, 99, 15, 33}, {26, 34, 35, 27}, {25, 42, 36, 8}, {89, 109, 38, 20}, {43, 54, 30, 21}, {48, 57, 36, 31}, {83, 86, 1, 35}, {65, 74, 4, 21}, {17, 27, 4, 38}, {1, 13, 25, 18}, {75, 93, 28, 32}, {40, 41, 40, 40}, {6, 11, 6, 34}, {2, 8, 4, 23}, {82, 98, 34, 18}, {81, 94, 30, 8}, {33, 38, 39, 31}, {89, 101, 5, 16}, {22, 32, 22, 27}, {124, 139, 20, 7}, {75, 84, 8, 18}, {26, 37, 8, 4}, {90, 92, 32, 25}, {69, 71, 31, 34}, {90, 105, 30, 38}, {8, 28, 35, 26}, {112, 115, 29, 21}, {103, 121, 29, 28}, {52, 60, 15, 31}, {86, 92, 8, 2}, {79, 88, 39, 3}, {124, 127, 39, 16}, {5, 20, 25, 13}, {38, 57, 25, 39}, {56, 71, 8, 10}, {49, 60, 6, 1}, {49, 52, 35, 16}, {64, 75, 36, 39}, {4, 16, 34, 13}, {125, 129, 8, 19}, {99, 119, 29, 28}, {91, 92, 13, 3}, {127, 135, 13, 19}, {49, 62, 12, 19}, {10, 26, 25, 2}, {119, 120, 35, 12}, {111, 122, 22, 11}, {51, 67, 23, 15}, {66, 69, 9, 21}, {63, 71, 11, 38}, {28, 33, 31, 2},
{66, 84, 12, 11}, {29, 44, 12, 13}, {67, 87, 17, 1}, {82, 98, 7, 12}, {15, 16, 5, 31}, {10, 19, 29, 8}, {121, 123, 9, 15}, {42, 58, 4, 30}, {59, 66, 8, 33}, {75, 88, 39, 32}, {39, 51, 40, 27}, {19, 21, 25, 2}, {18, 30, 3, 38}, {0, 4, 27, 29}, {76, 77, 30, 9}, {42, 46, 1, 19}, {116, 133, 1, 18}, {119, 125, 16, 2}, {78, 93, 33, 2}, {111, 114, 9, 14}, {3, 21, 6, 22}, {26, 37, 21, 16}, {10, 23, 34, 6}, {52, 71, 24, 21}, {122, 140, 25, 38}, {107, 127, 1, 32}, {118, 129, 28, 8}, {52, 61, 7, 16}, {61, 65, 30, 5}, {57, 68, 39, 15}, {56, 75, 35, 18}, {25, 35, 1, 12}, {114, 116, 39, 15}, {117, 120, 24, 36}, {106, 121, 24, 16}, {113, 117, 27, 8}, {122, 133, 20, 1}, {53, 70, 18, 19}, {93, 98, 2, 6}, {71, 77, 37, 21}, {17, 35, 38, 14}, {84, 104, 38, 39}, {78, 84, 9, 36}, {36, 44, 7, 12}, {5, 9, 23, 27}, {29, 42, 37, 24}, {70, 84, 1, 22}, {81, 86, 8, 35}, {90, 92, 4, 9}, {62, 81, 12, 33}, {119, 132, 27, 11}, {113, 118, 32, 37}, {33, 37, 10, 29}, {117, 133, 5, 8}, {70, 88, 37, 40}, {48, 59, 32, 27}, {34, 37, 2, 38}, {116, 117, 19, 19}, {58, 62, 13, 21}, {34, 36, 34, 20}, {116, 118, 39, 10}, {38, 58, 17, 17}, {55, 69, 22, 37}, {119, 137, 29, 21}, {8, 22, 39, 16}, {85, 88, 4, 29}, {94, 95, 14, 36}, {119, 136, 16, 27}, {93, 103, 23, 16}, {44, 64, 22, 19}, {110, 112, 21, 29}, {15, 19, 4, 19}, {6, 20, 29, 10}, {3, 6, 9, 20}, {50, 68, 34, 35}, {13, 20, 28, 24}, {125, 132, 18, 20}, {112, 127, 2, 39}, {61, 74, 36, 29}, {123, 133, 39, 26}, {70, 87, 31, 30}, {80, 85, 40, 6}, {22, 35, 5, 23}, {92, 107, 14, 27}, {86, 104, 26, 24}, {79, 90, 4, 20}, {87, 88, 1, 27}, {19, 36, 8, 32}, {19, 26, 11, 1}, {95, 104, 14, 35}, {63, 66, 8, 5}, {122, 131, 7, 21}, {8, 19, 26, 7}, {1, 21, 18, 2}, {21, 38, 23, 26}, {81, 88, 7, 31}, {21, 32, 20, 25}, {114, 123, 11, 27}, {93, 112, 12, 31}, {37, 51, 11, 1},
{117, 134, 21, 36}, {3, 10, 39, 40}, {104, 122, 9, 40}, {86, 104, 9, 37}, {20, 27, 20, 9}, {47, 62, 25, 22}, {95, 102, 28, 20}, {42, 47, 21, 28}, {12, 18, 24, 27}, {65, 74, 2, 8}, {18, 26, 28, 18}, {65, 85, 21, 14}, {34, 50, 35, 35}, {92, 107, 26, 14}, {19, 27, 34, 24}, {82, 89, 2, 38}, {93, 95, 4, 6}, {124, 138, 6, 1}, {102, 104, 2, 24}, {58, 68, 33, 2}, {86, 94, 24, 17}, {46, 54, 18, 19}, {74, 91, 33, 28}, {105, 112, 1, 33}, {56, 62, 23, 12}, {57, 70, 38, 36}, {120, 132, 4, 36}, {30, 47, 10, 24}, {32, 51, 28, 29}, {117, 137, 25, 27}, {21, 41, 18, 13}, {45, 54, 22, 39}, {91, 106, 37, 10}, {44, 55, 5, 35}, {77, 94, 20, 6}, {104, 114, 8, 5}, {55, 75, 27, 20}, {4, 9, 11, 23}, {12, 16, 8, 35}, {124, 137, 30, 27}, {74, 94, 16, 32}, {70, 72, 32, 33}, {4, 5, 22, 31}, {8, 23, 12, 33}, {56, 71, 37, 25}, {69, 88, 37, 1}, {82, 101, 37, 14}, {36, 47, 2, 4}, {101, 104, 3, 18}, {4, 8, 13, 35}, {37, 51, 20, 2}, {69, 84, 29, 28}, {9, 17, 9, 26}, {127, 143, 20, 16}, {81, 95, 22, 40}, {77, 84, 4, 15}, {32, 37, 9, 20}, {19, 35, 28, 39}, {89, 94, 15, 40}, {111, 114, 3, 16}, {112, 116, 12, 29}, {77, 95, 16, 17}, {122, 135, 31, 8}, {37, 48, 34, 19}, {35, 40, 18, 4}, {86, 99, 23, 24}, {63, 69, 25, 22}, {41, 61, 31, 4}, {114, 120, 11, 37}, {33, 47, 11, 35}, {51, 52, 30, 5}, {124, 125, 18, 27}, {32, 51, 3, 4}, {120, 129, 25, 29}, {107, 121, 2, 32}, {58, 76, 1, 33}, {128, 134, 8, 24}, {85, 105, 21, 36}, {91, 101, 36, 15}, {34, 50, 1, 15}, {128, 145, 28, 35}, {14, 24, 3, 39}, {102, 115, 37, 19}, {37, 55, 5, 9}, {126, 134, 12, 12}, {13, 22, 37, 39}, {65, 68, 30, 30}, {115, 125, 31, 29}, {58, 61, 7, 11}, {123, 129, 33, 30}, {15, 16, 12, 37}, {57, 68, 21, 34}, {62, 74, 7, 12}, {19, 25, 22, 23}, {60, 61, 32, 38}, {24, 37, 5, 28}, {128, 142, 11, 11}, {3, 18, 40, 13}, {118, 133, 12, 31}, {51, 69, 6, 27},
{19, 30, 7, 27}, {49, 57, 17, 22}, {39, 53, 3, 39}, {36, 40, 1, 34}, {87, 88, 29, 40}, {97, 110, 8, 36}, {108, 120, 21, 33}, {82, 84, 1, 22}, {9, 23, 12, 25}, {25, 38, 35, 27}, {81, 99, 19, 6}, {98, 109, 38, 26}, {90, 94, 27, 4}, {74, 81, 28, 19}, {128, 130, 27, 30}, {52, 57, 15, 36}, {8, 21, 11, 28}, {115, 120, 18, 10}, {108, 126, 7, 11}, {70, 75, 16, 3}, {20, 22, 7, 1}, {110, 121, 5, 13}, {16, 20, 10, 28}, {14, 15, 27, 26}, {46, 57, 30, 3}, {2, 5, 14, 16}, {18, 21, 33, 3}, {117, 136, 8, 11}, {94, 111, 21, 30}, {41, 61, 30, 2}, {113, 121, 11, 37}, {58, 78, 21, 13}, {25, 32, 31, 20}, {10, 17, 21, 3}, {27, 30, 2, 26}, {1, 17, 12, 40}, {8, 20, 12, 20}, {82, 90, 35, 25}, {15, 27, 40, 9}, {11, 18, 40, 20}, {100, 107, 9, 6}, {6, 10, 2, 1}, {39, 40, 16, 8}, {16, 35, 7, 11}, {76, 80, 31, 14}, {16, 34, 12, 21}, {121, 127, 20, 20}, {66, 73, 36, 5}, {101, 120, 32, 17}, {25, 31, 14, 17}, {91, 99, 21, 5}, {6, 12, 11, 7}, {91, 102, 27, 12}, {82, 102, 24, 8}, {65, 67, 40, 35}, {7, 9, 19, 7}, {17, 31, 7, 20}, {16, 31, 17, 36}, {26, 36, 16, 16}, {104, 112, 13, 27}, {48, 67, 24, 3}, {46, 56, 32, 27}, {69, 89, 21, 20}, {114, 132, 33, 32}, {90, 106, 7, 27}, {78, 85, 5, 39}, {118, 136, 24, 25}, {110, 116, 28, 14}, {53, 70, 30, 34}, {106, 108, 36, 40}, {76, 96, 17, 23}, {21, 30, 10, 6}, {35, 45, 1, 5}, {92, 105, 30, 36}, {99, 110, 21, 32}, {123, 140, 5, 28}, {101, 109, 8, 18}, {91, 110, 29, 9}, {60, 62, 14, 25}, {98, 106, 35, 2}, {9, 26, 3, 9}, {74, 92, 5, 34}, {37, 45, 17, 2}, {37, 51, 2, 33}, {113, 131, 2, 9}, {106, 117, 26, 2}, {114, 131, 27, 32}, {123, 133, 19, 22}, {75, 80, 10, 20}, {84, 90, 33, 33}, {102, 116, 24, 29}, {39, 44, 3, 2}, {11, 13, 7, 2}, {90, 91, 23, 19}, {67, 86, 39, 40}, {122, 135, 37, 5}, {105, 116, 2, 8}, {71, 82, 19, 19}, {58, 65, 13, 22}, {76, 91, 37, 16},
{27, 28, 13, 16}, {24, 38, 21, 2}, {7, 13, 20, 21}, {2, 12, 15, 29}, {26, 32, 13, 34}, {81, 93, 16, 13}, {42, 56, 15, 14}, {66, 72, 6, 10}, {49, 59, 29, 17}, {51, 70, 23, 29}, {119, 128, 34, 6}, {36, 56, 38, 15}, {10, 23, 17, 11}, {3, 7, 24, 12}, {15, 24, 26, 8}, {74, 76, 17, 10}, {70, 86, 19, 25}, {27, 45, 38, 16}, {107, 119, 31, 18}, {101, 114, 23, 37}, {108, 125, 39, 19}, {1, 14, 27, 26}, {110, 121, 35, 8}, {37, 46, 28, 25}, {89, 94, 17, 8}, {119, 123, 19, 6}, {13, 27, 22, 18}, {32, 44, 40, 19}, {52, 56, 17, 39}, {96, 98, 32, 32}, {46, 60, 14, 24}, {120, 131, 9, 24}, {54, 71, 29, 10}, {19, 31, 37, 22}, {39, 55, 23, 30}, {47, 59, 15, 8}, {40, 49, 20, 23}, {69, 82, 22, 32}, {2, 8, 10, 21}, {79, 81, 33, 28}, {6, 20, 7, 9}, {46, 48, 12, 15}, {54, 57, 11, 1}, {93, 95, 24, 40}, {101, 110, 37, 35}, {14, 29, 8, 14}, {4, 16, 36, 38}, {95, 98, 4, 8}, {104, 107, 6, 5}, {21, 29, 25, 40}, {1, 10, 25, 2}, {57, 59, 24, 2}, {118, 119, 30, 1}, {107, 127, 28, 37}, {127, 141, 5, 38}, {87, 99, 33, 15}, {62, 73, 22, 29}, {41, 50, 16, 18}, {100, 113, 15, 20}, {37, 52, 40, 15}, {17, 35, 13, 16}, {33, 48, 39, 18}, {98, 111, 29, 2}, {59, 78, 33, 12}, {7, 16, 40, 19}, {47, 55, 30, 29}, {35, 46, 40, 8}, {101, 112, 15, 39}, {73, 88, 21, 2}, {56, 76, 4, 10}, {71, 75, 20, 4}, {98, 105, 35, 29}, {5, 24, 30, 20}, {32, 36, 19, 33}, {61, 70, 28, 35}, {101, 109, 11, 29}, {47, 50, 31, 24}, {106, 125, 31, 4}, {36, 55, 24, 34}, {7, 8, 17, 18}, {47, 67, 34, 32}, {11, 12, 29, 2}, {32, 34, 9, 37}, {48, 64, 14, 17}, {108, 114, 26, 31}, {124, 142, 32, 3}, {17, 37, 36, 17}, {22, 40, 18, 6}, {103, 104, 39, 29}, {47, 57, 18, 18}, {85, 92, 6, 21}, {100, 118, 26, 27}, {105, 114, 22, 27}, {104, 107, 14, 30}, {99, 117, 27, 20}, {91, 95, 15, 8}, {21, 26, 39, 25}, {51, 71, 30, 37}, {63, 73, 21, 32}, {128, 145, 5, 18},
{50, 51, 39, 31}, {35, 53, 27, 23}, {107, 114, 2, 24}, {12, 28, 24, 4}, {5, 20, 34, 39}, {98, 106, 28, 23}, {23, 28, 30, 34}, {69, 87, 10, 38}, {23, 42, 16, 27}, {27, 43, 16, 13}, {59, 77, 27, 33}, {28, 45, 28, 30}, {88, 89, 15, 9}, {103, 106, 14, 23}, {89, 105, 3, 28}, {29, 32, 36, 11}, {29, 43, 32, 20}, {104, 106, 8, 18}, {19, 22, 14, 11}, {99, 114, 25, 40}, {18, 27, 17, 28}, {69, 81, 36, 15}, {15, 30, 6, 12}, {46, 64, 12, 21}, {38, 44, 35, 33}, {36, 44, 31, 5}, {20, 29, 35, 19}, {83, 96, 14, 32}, {127, 135, 18, 2}, {114, 134, 23, 35}, {34, 45, 18, 40}, {122, 131, 19, 21}, {86, 103, 37, 36}, {94, 110, 15, 26}, {35, 54, 33, 24}, {91, 102, 12, 31}, {26, 42, 27, 1}, {9, 29, 35, 30}, {115, 130, 36, 4}, {44, 55, 32, 38}, {62, 67, 27, 38}, {65, 83, 18, 2}, {6, 13, 33, 32}, {46, 55, 33, 11}, {30, 46, 1, 19}, {76, 87, 30, 27}, {41, 59, 14, 25}, {49, 51, 39, 19}, {122, 140, 3, 3}, {105, 108, 33, 40}, {106, 121, 32, 19}, {76, 96, 16, 11}, {41, 51, 27, 6}, {81, 101, 10, 30}, {121, 126, 19, 24}, {113, 125, 28, 25}, {47, 50, 38, 13}, {105, 123, 10, 27}, {85, 100, 1, 36}, {56, 72, 37, 25}, {69, 83, 24, 4}, {106, 124, 33, 27}, {99, 117, 30, 30}, {41, 57, 27, 31}, {80, 87, 7, 13}, {43, 44, 13, 37}, {33, 37, 6, 25}, {16, 24, 27, 20}, {126, 140, 4, 34}, {19, 38, 8, 19}, {96, 100, 14, 15}, {48, 54, 13, 26}, {56, 73, 21, 14}, {92, 108, 25, 3}, {14, 17, 22, 4}, {76, 77, 30, 16}, {30, 49, 32, 8}, {37, 54, 4, 24}, {6, 21, 37, 10}, {22, 26, 2, 23}, {81, 91, 10, 9}, {92, 95, 34, 17}, {25, 37, 12, 26}, {2, 4, 34, 23}, {7, 25, 8, 6}, {69, 86, 10, 10}, {112, 122, 4, 28}, {103, 110, 21, 23}, {120, 123, 2, 37}, {51, 54, 7, 14}, {29, 41, 37, 20}, {125, 143, 31, 28}, {31, 36, 28, 38}, {90, 105, 12, 2}, {14, 16, 30, 37}, {124, 128, 36, 22}, {45, 60, 12, 21}, {67, 83, 27, 17}, {100, 112, 37, 30},
};
// *INDENT-ON*
for(i = 0; i < 1000; i++) {
read_range(&f, ranges[i][0], ranges[i][1]);
uint8_t from = ranges[i][0];
uint8_t to = ranges[i][1];
read_range(&f, from, to);
from = to + 1;
uint8_t next = ranges[i][2];
read_next(&f, from, next);
from += next;
next = ranges[i][3];
read_next(&f, from, next);
}
res = lv_fs_close(&f);
TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
drv->cache_size = original_cache_size;
}
#endif