Skip to content
Snippets Groups Projects
Commit 1fa6fdc6 authored by dam1n19's avatar dam1n19
Browse files

ATO2-24: Added Stalling Control to message build testbench

parent 9ee6e47c
No related branches found
No related tags found
No related merge requests found
...@@ -61,15 +61,18 @@ module tb_sha256_message_build; ...@@ -61,15 +61,18 @@ module tb_sha256_message_build;
logic [511:0] data_in_queue [$]; logic [511:0] data_in_queue [$];
logic data_in_last_queue [$]; logic data_in_last_queue [$];
int data_in_gap_queue [$];
logic data_in_wait_queue; logic data_in_wait_queue;
logic [63:0] cfg_size_queue [$]; logic [63:0] cfg_size_queue [$];
logic [1:0] cfg_scheme_queue [$]; logic [1:0] cfg_scheme_queue [$];
logic cfg_last_queue [$]; logic cfg_last_queue [$];
int cfg_gap_queue [$];
logic cfg_wait_queue; logic cfg_wait_queue;
logic [511:0] data_out_queue [$]; logic [511:0] data_out_queue [$];
logic data_out_last_queue [$]; logic data_out_last_queue [$];
int data_out_stall_queue [$];
logic data_out_wait_queue; logic data_out_wait_queue;
// Handle Valid and Data for data_in // Handle Valid and Data for data_in
...@@ -126,25 +129,34 @@ module tb_sha256_message_build; ...@@ -126,25 +129,34 @@ module tb_sha256_message_build;
logic [511:0] data_out_check; logic [511:0] data_out_check;
logic data_out_last_check; logic data_out_last_check;
logic check_output; int data_out_stall;
logic test_end;
int packet_num; int packet_num;
// Handle Output Ready Driving // Handle Output Ready Signal Verification
always_ff @(posedge clk, negedge nrst) begin: data_out_recieve always @(posedge clk) begin
if (!nrst) begin // Check Override Control on Ready
if (data_out_drive_ready) begin
// Count down to zero before enabling Ready
if (data_out_stall > 0) begin
data_out_stall <= data_out_stall - 1;
data_out_ready <= 1'b0; data_out_ready <= 1'b0;
check_output <= 1'b0;
test_end <= 1'b0;
end else begin end else begin
// Synchronise Ready to Clock // Wait for handshake before updating stall value
if (data_out_drive_ready) begin if ((data_out_valid == 1'b1) && (data_out_ready == 1'b1)) begin
if (data_out_stall_queue.size() > 0) begin
data_out_stall <= data_out_stall_queue.pop_front();
end
data_out_ready <= 1'b0;
// Keep Ready Asserted until handshake seen
end else begin
data_out_ready <= 1'b1; data_out_ready <= 1'b1;
end
end
end else begin end else begin
data_out_ready <= 1'b0; data_out_ready <= 1'b0;
end end
end end
end
// Handle Output Data Verification // Handle Output Data Verification
always @(posedge clk) begin always @(posedge clk) begin
...@@ -178,13 +190,16 @@ module tb_sha256_message_build; ...@@ -178,13 +190,16 @@ module tb_sha256_message_build;
logic [511:0] input_data; // Temporary Input Data Storage logic [511:0] input_data; // Temporary Input Data Storage
logic input_data_last; // Temporary Input Data Last logic input_data_last; // Temporary Input Data Last
int input_data_gap; // Temporary Input Gap
logic [63:0] input_cfg_size; // Temporary cfg size logic [63:0] input_cfg_size; // Temporary cfg size
logic [1:0] input_cfg_scheme; // Temporary cfg scheme logic [1:0] input_cfg_scheme; // Temporary cfg scheme
logic input_cfg_last; // Temporary cfg last; logic input_cfg_last; // Temporary cfg last;
int input_cfg_gap; // Temporary cfg gap;
logic [511:0] output_data; // Temporary Output Data Storage logic [511:0] output_data; // Temporary Output Data Storage
logic output_data_last; // Temporary Output Data Last logic output_data_last; // Temporary Output Data Last
int output_data_stall; // Temporary Output Stall
initial begin initial begin
$dumpfile("sha256_message_build.vcd"); $dumpfile("sha256_message_build.vcd");
...@@ -195,32 +210,36 @@ module tb_sha256_message_build; ...@@ -195,32 +210,36 @@ module tb_sha256_message_build;
// Read input data into Queue // Read input data into Queue
fd = $fopen("../stimulus/testbench/input_data_stim.csv", "r"); fd = $fopen("../stimulus/testbench/input_data_stim.csv", "r");
while ($fscanf (fd, "%x,%b", input_data, input_data_last) == 2) begin while ($fscanf (fd, "%x,%b,%d", input_data, input_data_last, input_data_gap) == 3) begin
data_in_queue.push_back(input_data); data_in_queue.push_back(input_data);
data_in_last_queue.push_back(input_data_last); data_in_last_queue.push_back(input_data_last);
data_in_gap_queue.push_back(input_data_gap);
end end
$fclose(fd); $fclose(fd);
// Read input cfg into Queue // Read input cfg into Queue
fd = $fopen("../stimulus/testbench/input_cfg_stim.csv", "r"); fd = $fopen("../stimulus/testbench/input_cfg_stim.csv", "r");
while ($fscanf (fd, "%x,%x,%b", input_cfg_size, input_cfg_scheme, input_cfg_last) == 3) begin while ($fscanf (fd, "%x,%x,%b,%d", input_cfg_size, input_cfg_scheme, input_cfg_last, input_cfg_gap) == 4) begin
cfg_size_queue.push_back(input_cfg_size); cfg_size_queue.push_back(input_cfg_size);
cfg_scheme_queue.push_back(input_cfg_scheme); cfg_scheme_queue.push_back(input_cfg_scheme);
cfg_last_queue.push_back(input_cfg_last); cfg_last_queue.push_back(input_cfg_last);
cfg_gap_queue.push_back(input_cfg_gap);
end end
$fclose(fd); $fclose(fd);
// Read output data into Queue // Read output data into Queue
fd = $fopen("../stimulus/testbench/inout_message_block_stim_ref.csv", "r"); fd = $fopen("../stimulus/testbench/output_message_block_ref.csv", "r");
while ($fscanf (fd, "%x,%b", output_data, output_data_last) == 2) begin while ($fscanf (fd, "%x,%b,%d", output_data, output_data_last, output_data_stall) == 3) begin
data_out_queue.push_back(output_data); data_out_queue.push_back(output_data);
data_out_last_queue.push_back(output_data_last); data_out_last_queue.push_back(output_data_last);
data_out_stall_queue.push_back(output_data_stall);
end end
$fclose(fd); $fclose(fd);
// Initialise First Checking Values // Initialise First Checking Values
data_out_check = data_out_queue.pop_front(); data_out_check = data_out_queue.pop_front();
data_out_last_check = data_out_last_queue.pop_front(); data_out_last_check = data_out_last_queue.pop_front();
data_out_stall = data_out_stall_queue.pop_front();
// Defaultly enable Message Builder // Defaultly enable Message Builder
en = 1; en = 1;
......
...@@ -9,9 +9,7 @@ ...@@ -9,9 +9,7 @@
# Copyright 2022, SoC Labs (www.soclabs.org) # Copyright 2022, SoC Labs (www.soclabs.org)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
import os, sys, random, math, csv import os, random, math, csv
import subprocess
import platform
import binascii import binascii
import hashlib import hashlib
...@@ -29,17 +27,30 @@ def main(): ...@@ -29,17 +27,30 @@ def main():
seed = int(stim_list[0][0]) seed = int(stim_list[0][0])
packets = int(stim_list[0][1]) packets = int(stim_list[0][1])
gap_limit = int(stim_list[0][2])
stall_limit = int(stim_list[0][3])
random.seed(seed) random.seed(seed)
print(f"Generating {packets} packets using seed: {seed}") print(f"Generating {packets} packets using seed: {seed}")
cfg_words_list = [] cfg_words_list = []
cfg_words_gap_list = []
in_data_words_list = [] in_data_words_list = []
in_data_words_last_list = [] in_data_words_last_list = []
out_data_words_list = [] in_data_words_gap_list = []
out_data_words_last_list = [] message_block_list = []
message_block_last_list = []
message_block_gap_list = []
message_block_stall_list = []
hash_list = [] hash_list = []
hash_stall_list = []
for i in range(packets): for i in range(packets):
# Generate Gapping and Stalling Values
# Gapping - Period to wait before taking Input Valid High
# Stalling - Period to wait before taking Output Read High
cfg_words_gap_list.append(random.randrange(0,gap_limit))
hash_stall_list.append(random.randrange(0,stall_limit))
# Generate expected output in 512 bit chunks # Generate expected output in 512 bit chunks
cfg_size = math.ceil(random.randint(0,pow(2,14))/8)*8 cfg_size = math.ceil(random.randint(0,pow(2,14))/8)*8
cfg_size_bin = "{0:b}".format(cfg_size) cfg_size_bin = "{0:b}".format(cfg_size)
...@@ -50,39 +61,49 @@ def main(): ...@@ -50,39 +61,49 @@ def main():
data = "{0:b}".format(random.getrandbits(cfg_size)) data = "{0:b}".format(random.getrandbits(cfg_size))
data = "0"*(cfg_size - len(data)) + data # Pad Data to length of config (Python like to concatenate values) data = "0"*(cfg_size - len(data)) + data # Pad Data to length of config (Python like to concatenate values)
chunked_data_words = chunkstring(str(data),512) chunked_data_words = chunkstring(str(data),512)
in_data_words = chunked_data_words.copy() in_data_words = chunked_data_words.copy()
in_data_words[-1] = in_data_words[-1] + "0"*(512-len(in_data_words[-1])) in_data_words[-1] = in_data_words[-1] + "0"*(512-len(in_data_words[-1]))
in_data_words_last = [] in_data_words_last = []
out_data_words = chunked_data_words.copy() in_data_words_gap = []
out_data_words_last = [] message_block = chunked_data_words.copy()
message_block_last = []
message_block_stall = []
message_block_gap = []
last_len = len(chunked_data_words[-1]) last_len = len(chunked_data_words[-1])
# print(f"{chunked_data_words[-1]} {last_len}") # print(f"{chunked_data_words[-1]} {last_len}")
if (last_len == 512): if (last_len == 512):
out_data_words.append("1" + "0"*447 + cfg_size_str) message_block.append("1" + "0"*447 + cfg_size_str)
else: else:
out_data_words[-1] = out_data_words[-1] + "1" message_block[-1] = message_block[-1] + "1"
if last_len > 447: # Size can't fit in last word if last_len > 447: # Size can't fit in last word
# Pad last word to 512 bits # Pad last word to 512 bits
out_data_words[-1] = out_data_words[-1] + "0"*(512 - len(out_data_words[-1])) message_block[-1] = message_block[-1] + "0"*(512 - len(message_block[-1]))
# Create New word with Size at the end # Create New word with Size at the end
out_data_words.append("0"*448 + cfg_size_str) message_block.append("0"*448 + cfg_size_str)
else: else:
out_data_words[-1] = out_data_words[-1] + "0"*(512 - 64- len(out_data_words[-1])) + cfg_size_str message_block[-1] = message_block[-1] + "0"*(512 - 64- len(message_block[-1])) + cfg_size_str
for i in range(len(in_data_words) - 1): for i in range(len(in_data_words)):
in_data_words_last.append("0") in_data_words_last.append("0")
in_data_words_last.append("1") in_data_words_gap.append(random.randrange(0,gap_limit))
in_data_words_last[-1] = "1"
for i in range(len(out_data_words) - 1): for i in range(len(message_block)):
out_data_words_last.append("0") message_block_last.append("0")
out_data_words_last.append("1") message_block_stall.append(random.randrange(0,stall_limit))
message_block_gap.append(random.randrange(0,gap_limit))
message_block_last[-1] = "1"
cfg_words_list.append(cfg_size_str) cfg_words_list.append(cfg_size_str)
in_data_words_list += in_data_words in_data_words_list += in_data_words
in_data_words_last_list += in_data_words_last in_data_words_last_list += in_data_words_last
out_data_words_list += out_data_words in_data_words_gap_list += in_data_words_gap
out_data_words_last_list += out_data_words_last message_block_list += message_block
message_block_last_list += message_block_last
message_block_gap_list += message_block_gap
message_block_stall_list += message_block_stall
intval = int(data, 2) intval = int(data, 2)
hash_val = 0 hash_val = 0
h=int(data, 2).to_bytes((len(data) + 7) // 8, byteorder='big') h=int(data, 2).to_bytes((len(data) + 7) // 8, byteorder='big')
...@@ -94,28 +115,35 @@ def main(): ...@@ -94,28 +115,35 @@ def main():
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_data_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_data_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(in_data_words_list): for idx, word in enumerate(in_data_words_list):
writer.writerow(["{0:x}".format(int(word, 2)), in_data_words_last_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), in_data_words_last_list[idx], in_data_words_gap_list[idx]])
# Write out Cfg Stimulus to Text File # Write out Cfg Stimulus to Text File
input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_last"] input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_cfg_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_cfg_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(cfg_words_list): for idx, word in enumerate(cfg_words_list):
writer.writerow(["{0:x}".format(int(word, 2)), "0", "1"]) writer.writerow(["{0:x}".format(int(word, 2)), "0", "1", cfg_words_gap_list[idx]])
# Write out Expected output to text file # Write out Expected output to text file
output_header = ["output_data", "output_data_last"] output_header = ["output_data", "output_data_last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "inout_message_block_stim_ref.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_message_block_ref.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f)
for idx, word in enumerate(message_block_list):
writer.writerow(["{0:x}".format(int(word, 2)), message_block_last_list[idx], message_block_stall_list[idx]])
# Write out Message Block (Input) to text file
output_header = ["message_block_data", "message_block_data_last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_message_block_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(out_data_words_list): for idx, word in enumerate(message_block_list):
writer.writerow(["{0:x}".format(int(word, 2)), out_data_words_last_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), message_block_last_list[idx], message_block_gap_list[idx]])
# Write out hash value to text file # Write out hash value to text file
output_header = ["output_data", "output_data_last"] output_header = ["output_data", "output_data_last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_hash_ref.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_hash_ref.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(hash_list): for idx, word in enumerate(hash_list):
writer.writerow([word, "1"]) writer.writerow([word, "1", hash_stall_list[idx]])
def chunkstring(string, length): def chunkstring(string, length):
array_len = math.ceil(len(string)/length) array_len = math.ceil(len(string)/length)
......
40484783887,100 40484783887,100,500,600
\ No newline at end of file \ No newline at end of file
Source diff could not be displayed: it is too large. Options to address this: view the blob.
3630,0,1 f40,0,1,342
3590,0,1 3a70,0,1,76
1c0,0,1 1090,0,1,120
438,0,1 1b10,0,1,480
a58,0,1 2718,0,1,225
d90,0,1 1e10,0,1,367
af8,0,1 3d08,0,1,310
3480,0,1 fc8,0,1,137
2ec8,0,1 3388,0,1,93
1c10,0,1 2620,0,1,330
2ef0,0,1 3570,0,1,387
5e8,0,1 3258,0,1,215
20f8,0,1 18f0,0,1,358
2a18,0,1 700,0,1,360
4a0,0,1 1e60,0,1,111
690,0,1 2cc0,0,1,173
e08,0,1 3090,0,1,259
338,0,1 2e88,0,1,54
1a78,0,1 2980,0,1,205
2e58,0,1 1d98,0,1,448
7c8,0,1 3398,0,1,52
27b0,0,1 2628,0,1,196
22c8,0,1 fb0,0,1,474
3340,0,1 20e0,0,1,254
21f8,0,1 37e8,0,1,120
17a0,0,1 678,0,1,306
2558,0,1 3c00,0,1,338
a78,0,1 1858,0,1,71
2c78,0,1 a88,0,1,299
27e0,0,1 39c0,0,1,350
1a60,0,1 2718,0,1,31
3b60,0,1 1b18,0,1,31
2cd8,0,1 1910,0,1,111
e68,0,1 3460,0,1,286
31e8,0,1 928,0,1,418
3858,0,1 c00,0,1,359
3170,0,1 3cc8,0,1,272
32f8,0,1 1690,0,1,15
3bf8,0,1 490,0,1,388
3a10,0,1 3c98,0,1,51
a8,0,1 768,0,1,71
3c00,0,1 3aa8,0,1,180
b08,0,1 2530,0,1,93
1900,0,1 1698,0,1,148
3980,0,1 2b18,0,1,1
2438,0,1 2cb8,0,1,197
10e8,0,1 1228,0,1,367
4000,0,1 478,0,1,98
720,0,1 ef8,0,1,276
3f08,0,1 2cb8,0,1,294
ae0,0,1 2368,0,1,331
1a68,0,1 2c98,0,1,120
1930,0,1 878,0,1,398
1850,0,1 160,0,1,335
2f28,0,1 d98,0,1,303
340,0,1 2080,0,1,272
2710,0,1 3558,0,1,238
1548,0,1 2650,0,1,264
780,0,1 898,0,1,310
15c0,0,1 1588,0,1,459
11c0,0,1 2988,0,1,355
2d28,0,1 1f8,0,1,392
15d8,0,1 d40,0,1,219
1050,0,1 f58,0,1,30
14b0,0,1 2e10,0,1,71
8b0,0,1 1480,0,1,118
3050,0,1 1750,0,1,97
1b0,0,1 21a0,0,1,171
448,0,1 24e0,0,1,9
c8,0,1 30b0,0,1,233
20e8,0,1 1f88,0,1,157
24a0,0,1 2c18,0,1,108
30a0,0,1 23b0,0,1,155
3f0,0,1 2aa0,0,1,310
f70,0,1 3700,0,1,186
1e28,0,1 2008,0,1,95
3490,0,1 17a0,0,1,108
c08,0,1 e38,0,1,212
3b70,0,1 c50,0,1,293
1f60,0,1 2698,0,1,10
35f8,0,1 1cb8,0,1,122
2180,0,1 2740,0,1,59
60,0,1 b70,0,1,48
3820,0,1 34c0,0,1,236
1968,0,1 2900,0,1,413
2a80,0,1 2ae8,0,1,482
3bc8,0,1 16b0,0,1,254
3298,0,1 fd0,0,1,203
1e38,0,1 2278,0,1,383
1560,0,1 cc0,0,1,136
9d8,0,1 978,0,1,36
f0,0,1 2cc8,0,1,120
2da8,0,1 3a10,0,1,326
20a8,0,1 3ae8,0,1,64
10c0,0,1 34a8,0,1,59
28a8,0,1 1180,0,1,476
fb8,0,1 3d98,0,1,396
718,0,1 1310,0,1,93
3ab0,0,1 1138,0,1,136
3230,0,1 5f0,0,1,220
Source diff could not be displayed: it is too large. Options to address this: view the blob.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
93600f9237d35836a53426932fd59c48dc97e466111f58f9a8e06a9bfd3e4cb5,1 3a632d96dd8d2811c0e470e8152ef4382e81cd441bf9a4fe26cedf299f56b820,1,433
fe9cc4c8daad1afa80e9405239a06f131455d5c37aff5edcced7eb40947f17f2,1 27fef999e02c3bb7fd807d900b7ef9ce3a8ec03100b20504bafa5b5f8d96d619,1,78
624d784bf186d6d794df78aaf2ca5eaa2e787ee94656a3311500fe3af82d343a,1 4a803f6e016a71f6a58a99e42f7a79e1fe09fcd12343f04fd928e708051d68d9,1,525
f012c9bc8853fb3661ad72863ad21e18cac41d6c1b47da48390c63bf84d1ac12,1 df8961e96646559ccc2476f142ddebb3acc04e5483b52dc9d05ab32b7117734e,1,125
98ff791e3755bb5b10b0f3c12ef6afd5836263d7207817e1d4e3cc834ee54889,1 6bfcec5da30e822d3dcfd12bbf162db74c97f7e87c9f138d43f1ef964e90baca,1,419
1a60ec34bfffac95f835a27718231ca7c9f62444ca2a21b9d54e562f861e1d87,1 67ef5eeca6b559576c9c8aec7a59df86f15b65d24ba61e52ead5672171b8b81b,1,313
1a4ff7dba62e98d5429c5ef0005b4fb8a9969363c7b08e0e6e723d741ac0da70,1 6b6607ea86ba20857d24586571dbfc0db43732f166ba61b78e63ae0d87cddab7,1,448
205286357133c6e0f476852ce93c58d08a1e4b9309f2a4ae9152c190dc5aba32,1 c12d545335f25c1fb90e55ac7d8255f1cedb49f70ab829303d3123434812896c,1,314
dfa1e6f716d189e7b66ac07e9257cc379d943daa992370f4c3da4f5f99e57fff,1 de74e5ecb9fb69ac465f6956707889e711c210fb5f2314c2872e65a2b9bb4b9e,1,317
ed882db02197f502eded28783e75fd30b8d778294aea7d8502833a53de11ffb7,1 cfcd2b18687e07abfac9c96b16b4e7b72e972b3fe0c9d3a4b5a091222ebd123f,1,171
74ce24e6c8c204a62b911b5e979101ccadb8a3e6d6386b45048a08d9e581c57d,1 0492242b7ee6093e439ffed7447ca8c4a82ca91a49b5d83cfee98c9211b80695,1,486
cc605f315042178b5f8f56fb418fb0cf0cbde78e3e4ce59c7108beceedc25d41,1 ff49f08e0b27592cae3ef785341ed78c2c786ef400535e575a4ab19b106bf9b2,1,144
4e2f09407c189669acaa0453317b1468eb30631ebd4d0b323573559a15813b58,1 34046340c6ab4e8158f2f3fdcdb42b185c032803740ea5a402384921e06dc1c3,1,284
3d00df228c41ef8a499fa511460b1590a1fbd533153e23c24b7bea49f5c9a2d1,1 7b92421174dce82cd124183f7c78188dc5fd4dd1bdf86694f519cc7cf96956fa,1,172
c0886fcf385edc957356c067c9e0ecfabf3201cdd48cdcb31391cba7674a6d1e,1 8c3628be7450f3f136d7fdb4d87717dc3a8508a70297fda3e7f2113a0a484d30,1,177
38ee0601875db84ca56ae20ce6c667813b926ec07066f56464d69ac3c41c2f5c,1 3f70e34af8b84aa2848c65f53823e9ed45238882f7ac44e8a271268adf9b9c5e,1,420
6eb526b678a588d3d8b7541ce5c616e8e434a9c42c993f607ac31000a5a03e20,1 a00487d0ffc2e448c63a15d18782d1492897f16ec8043355f1317813a3404299,1,172
657122296326ed4d681b8cfc55ac53196d9a669874c6a992faf57fa7b884642a,1 1eb6f1d55dfdd590cc726bd5f176c3ef167c8f0b80fdf5bf14a116363784f4c1,1,303
0ba2de601dfc1829d96fe2c5178bcb1224081fc1177fb4a401376785cfa3cbd1,1 0764ca1b992a84e877f44d4c32358f78b8d7c1b11693e985ff7ecf7e97b9c24d,1,413
7d7ac12c29cf6440218b7b6d7fba3fb6b20256f887237df25b44d73a7c171a84,1 e80f4581a343a8f449248b1de041f595d835d611f70d928c5d43746cc3e32e2c,1,207
d081e5ebd7bd5312b9678f168a59546a32f4ce2a8f07a687ede3628f045170b5,1 27f47b1ce83f65d4d20810d614cf736ca39876a4851194f0e52ff29142b4109b,1,162
c4b2a082bffe27b07413f57f8b9bfcb253ed979f88ebb05db9839701f0dab1a9,1 48f0149267ca250b3827b0209d2c12df5477935e0634dcafbba62a60910a73d1,1,357
484c121884c0704ee884679b1e111dd5c30c013a04cf0275501ea2b5848c9b08,1 85f88cfb595497fb8690a749a73aea426cb369f75a1b7f05782776f1decfb0f4,1,297
de224adf90c5d6bf425a4ac127286678a71c970d50cccf273f9a3d5e8e3e46cb,1 4bfc3e7cba46fac2d06e52d8758cca20c0575f065a98aea064cc15de1398f9aa,1,44
739497aff65f917e0dbd8922f1d4b74cfca8f8332fd65d4608be72b9a46f21f3,1 ade608db87b731087fb6b68d31540b6e09c97363aa68b724d644e9397be015da,1,135
fca0edce5460d67f59edcbaf6c9a5b296825aa5dda728cb984df1d54245c6614,1 7ed7eef16e0eb10e1b23122866cebcfba5ae2f8bee9e41e108027cae9583f974,1,518
034d660d55f4852eaa28aaf9e3052e41872d1a06ee0bf13a9299c6a6a59b1fa9,1 896c260b1f5ebc802f881ec28bc8a8c3846d02c4d4ae780534a97d6061e3f279,1,256
4e1236aa1225ed29db24b90e8ea0dda2653de6b6a6fd5fea1e4a1a374770b723,1 0d22239dea12d091620bb92df3759c93956b2ce70af86b5d73b49125006bb1dc,1,337
4aaed2d23280aba9dce962124797774128ddb49556f44d8f8f1c7d4cc6c73c7c,1 43ce9d67967d2d344a9f20e3973e50d70d488b6c434c54b04c165257408ea075,1,28
7633281c8c3f363d73e2a17a63ee48570ee5e32d4776da8c90a187108b11bddd,1 2101c21943e3589489da7045af7b8f100f5d9e304dc9e5a58880027481d3982c,1,522
53e633a050ada08beda96ac58fd931291b58e5211233f7491c24d9f3b1f98181,1 b7ec6bb32c482b1ea72af5fd3a5c281e98216eac7e1dad6b38f70739e7f78f8c,1,227
b3af7082029db291b8308f743c8c3512704a0f15c3ca71c08f940642f0730b81,1 47fa938589eec4f9cb7b1eba977fd7821c366cd95c88e4122e6cbe2cc066faaa,1,575
2447c609985d8a4905d5e1b4f1857e2e6e8d3ddb5991372228e16621c7530967,1 886ee33935e04543b973c4ab381ce2acf58d4d408b291a61d8dedd2b4f67d839,1,476
89c15ce38fa5ec69697d4aa683140b1df5fc515dfa266bef9b450b258e7ccebb,1 dd8176d94a6c160e3fc7755f80986a4cb935f666a3a86a165bbf9d1dbd5d975d,1,270
5963f5bf0ab99d97484cb0063123d8d9111b197613b8eae490c1195c8a8ebe5f,1 9b5ab06de1dfdf909fa69e559ea01120e1d1faee9ea796470de0c753f6b32111,1,365
54fce60f952a73f54f6d39b26ef3d50fe86b086ca20eb8d40a64266249d3a223,1 f3e039bdad4921334980bf94152ab25ce3274a956c022dc69e8f3e4e395242be,1,87
4ba9738e6caf4f6283813b05be613655c35bcdd271dcb0fe756813dd7506eadd,1 75cf5b7fbafddef18bcaf1a34e53515a8551cb043fa1733d195aee305d1317d2,1,171
e5e6e7d6d2dc5f7032e3521eb72c8be2f8231f27b9ce1c32069b1046842fb4fe,1 85a0257800ea9cf304f727373630f633fcc8ac8d9fc88400d55b6a92a9dc782d,1,541
38775d5af4fce933178f866d44bd21609847c4279ecc1b3ab0c2f57880ef81df,1 bd0c0e804285163e3942316c0116a41af1e87ac9c89dd15db59bbdd66ef56cbc,1,483
5afc96bc1300894bbb809012941a14169c02db51f883eb3a2a4ac93ee222627f,1 ef3ebdeb05ed812744f00d94eb5576c86587004408b5db0a9300d388328f02aa,1,380
c348ee4d77e8144053f0e27549cb2f1ebd028f6eeb0d1197980b3b97df977c5b,1 52028bf4c438c76b20e3ab385850d1893ba5509851ec3bbfcd9d8ef1f426ad08,1,96
c82ec527ac5351dc4bb9812176a2787d9e22324f9b4add919f8ec3674ee4619a,1 d974971939887550a7bd37b2fed8131d7b5740041da1d9b1a4e3d79c03ec0b07,1,81
8cc244effc06c74a0d8b0c4746ac609f723a32a7d868cc66cec5a7c26ab48eff,1 b90d97f0cf4bf973434b01725129ec7ffddd7568788e83d83e76acfaa5560297,1,232
def6ca5a4b0906cd764052e6e78f5fef35e2d77e2682322008b6565dec7efe64,1 74c4790d1257e5d571dd219f1f00778ae008e997ebcf03ea98355f40f7c2d315,1,557
2bb65e8da88dc76c65688ce1605114a5e86059a98b604cdc6bd8f8dd9a4ecdf4,1 5f852b6b58844e1379088ec3d24eb3907157883ab47a8a16b9b19ce8e79e11a2,1,394
99c8ecdd5eb47d6521f55a9b4192421652b7a0d675eb680121c7dc81ce61c09e,1 66c68edae1364128e0c93a14369fd5d136eae4d499da839b92f61228a4c1a809,1,343
032c8047c50d56433265dce41c4625ee628a755a0302b0764e96a6aa43718057,1 3bd7392143bec4b405121a9db873dd0ce6828e4c188daff0e181bcb68b0a2c01,1,281
47bb06fd52170a18a7cceb0fb7d3e4d9f4beab527cedca3c9a9001c69f45ae8e,1 2af682c8855e27b7be007ed72d94dc3a3a6c72c38f3eb89179458ee5a01bb359,1,108
a718d559d0cd2c99c67cac31e9f30c8bb89aff136fef9300f517569a8908c41a,1 9120654088eea48172b45efc0dbbf49ab83d06f5e8a8cd80c2ddece367fb525a,1,185
1ad363adfdb4c3ed36941263a5ed9ccf20808d9e236be0d1ed14fb4f49867d2c,1 5c70c1f618ecf239ce50d494c34294a08817e3defbbb8615ce3d48cc79020d30,1,577
8c4ec05e89cb411cd9418af41e4ad0ed196eeeea0b4f76f930ac5a358de8016c,1 ede29d7b60927d48dac441398f88b5feaaffc5d979de4ddf24f5d69b769ea63d,1,410
a4116814f1647695c24fe179ceb0b956493128fc1f1a1c7ce5eb66f3400a6268,1 0435e6f18f2b442e0ca0c87d147f09e8b29c1a5e1ab78df92443d41a8b6946be,1,398
7c8b577d16ed83247a8aa2cbfc7e9acdfbc9bd70731d306c40d862c324ee5b61,1 6ec882765f6be4519a2200d3c208e9aea76c49734ba8e017e077545f00b1363c,1,422
278cc317a218e1588b5db160a6aa67e5ff039eb2730a37f139311d29d98ae94f,1 db7e665774cc2a8ef374ab66ced93ce878b96deb22a1cd0358a9edebe930e6c3,1,568
81db190ce71f9aec802c4f7c229850bbf483d936ac4b0a700d064db399cc6c5d,1 16e0a35d58e0b6a95f8dc02292a820ea48fd2abebbd00bc6cdac548016f9c6d8,1,69
6619ee3925e120a8cdecf821c77a97142f6eabd21893eb731a151e36f2cc492e,1 ef794cbfd37034b5f54c4fce3b008a1b7b96ebb3a5cdaf679483c04e11e862da,1,421
f7981fabde66e16c4f2276f37bd8f12c493b6c2def305cc5e05d53a18d61372c,1 a560d7d244d44c1bfa7c25597fa759c7f4b324e30c7c2c8faddb93ed1e3af523,1,168
bcc006848bc6432e4292053b93ee8a0099d599d7af18ee38b01e53405589aeb6,1 134d46b3e9b0c2da17c804edb70fb075b38fe7c33db843d7a46932aeb0eab2b5,1,266
8ad0e5e648e22f44fa25030b9668bc5687b8c62d50d1877620c29aaf9eafa76c,1 1f9594f2c4ea93eace1683ec81ba9676d2a5de811f285ca1a7751d90537c5b68,1,433
9593e82030966d3f2a731e51f1b71751da8af4dc9d700e71dfcd29f644b4ac52,1 e1352fd752010c6f6bcc67cd37498ce99ac515e6b2f535ac4beeb32802a3e129,1,212
964188af3d285d1f59ee72a4f48bdf0546ffd6e2e29b897fdd6f973ca47b2fe5,1 e59bba8fafee8fad82fec0b370fafc953ea29fd457ca4c0c9b494c074b766b04,1,155
5d6e4894a562aa77c7aa51a5e9edfa76992687407cbb82dea367cf8720e7317e,1 0fb32dbf64e6d7b71d9367a9f930852ca296673a67c6d24852d88eae89aca6dd,1,208
20e8c6ad796c65be0ea4c28aa57c7a69ebba1b5d6944a3894a9a269a849b71c6,1 c703ed9e355a5329c0216175398ae78d1ba396117eb95a4a3788499761b52bea,1,96
2297277b4bb3840f014a2055fa6800b34ccebe498de06469aa0dc5dce808e6f8,1 008ae305f0e693bf48655d5b838377ffda870ab1d7c4b9b8b7d65739d11de4d8,1,503
1370005a2d428607890341c8b3af6951e0603f71bd6836eb2b762e8ecb573730,1 cee6b183a7f82fd0b9c6d600780ba0eef5742cd6fe9a3fdfe9b9322cdda2c66e,1,412
53216f1993249b1cd5e218544c80ccdb9fb54d9d146af57985998656d524b962,1 a2da0329db32bb842443a69cf039fc68cce4c97486393fc06ff05a9d36b41b2b,1,434
ca9483340500d3e40a66d19a19bea612d21ff28ab26987e6f5b7d8851b7f267e,1 87fd1fc3507cb6f46267e0ae840cebecb02820014c1052d0af68c8cd2e111dd7,1,419
bae1097a1cf3423e384e259fc0a5c2c64e58666d78b05e6cd71548b453fa5d15,1 c14ac10a9d7c50746f02d7ce4cde0aede9ad6eb8bfcfc3a079832b8ad2340504,1,368
5080c546e261c7220ca2432abbda992b274d21e48ae5469610ae31bb36f5e13b,1 c10f0953c19ccac1569e09e4b69d0b49f671b50b3b33a496cbe664a274c1f828,1,116
de04bace645900ad928fa8401238fc938f0bd59f3504ea234a4bb5cb8c84334b,1 eb97415525b713d4572577a62d124e6bb6e2319f2c6b92a3b0bde996ccf2772b,1,46
98267ef9d6ed43b1a93490e3e681829f8b99df3768ada378c15de0c81fc9d1ad,1 2ff1c19a66596adc4403e8871616c2ed291616bf2e2e45b5009e294714122d5c,1,589
1bf8c3c9d934c0c8db1870220981662c1ecb6c491afbbb1f0dbf6dfc9193eafe,1 12e1b32b238d72acb27770902b7e44ec13b4013aa21dd72374ffbd4bb5ad13ac,1,104
fccd6a202401d7b20cb84968a0a06edf950bbe54e87f98a27bbdea0bd903d1e7,1 2f1b70508046073b1a49fe6886688c86315d86839411a830f047199e6eb4f01f,1,216
aac6d1a43f591b082a5a2b19b21f38e1a8ac49a74cf097c5665c1700d8a5aab2,1 0795a610f783c79e02a418db3fc805b278505569d03a4856c34609ad42ab9fba,1,500
e267a6b6d1f6cdc2cea36fae52888a52068f3ce528798faa9991803f7a6bb623,1 796f43b5c765a3214c47150f4bf30e62b9efd6dfc6169ce650f0b713f2f8debc,1,95
8c93bc005a94b44289f6798a533ee4824eb73d013ad562a24b5ab41efe5d7493,1 77e96567e3ade0981548b7a68ec025e7eaa7179e81ba0a50dd89df599335ed96,1,472
2e71ed41da962b0875d127badfaaf0885fac4991791d3271bd468feafef99250,1 d6d4f2e191c78a405f35d1fd4afcbc137225a4f4a1a8e664c5cd555bace319ea,1,453
e0b62a6e58af0d43b17b1623b860e19f0a456abcade36757a289851ecfc275a8,1 27a57133f7784efb3e29e549d8027f314ec5c6291c1de531eac38402ee1d10c2,1,491
2b6c6a6b07899f9016cfb1e722ac2dd9312c0dd2cc479f7c014faabfcfbdcb32,1 c422e373fd06b692d0111029542f38867017abcd154cec3d19a47f0c6a9d569e,1,275
9cffc93effc94c3ebc01e211065ea8d5a48f08db4cc545be64a74746b0d63f41,1 47642c79139c3ae89852406218e171b486c5920e0e07bc07571aaa2039fbed2f,1,340
19a0dd5cb5078423376695bb8b7f4917b2d2d13bd9abe7bf91b472228de9a32f,1 a068789f0a2ab2dae50361fbb625579dc0f6dfc4b53bedb44391afb6b400d848,1,528
85822b3292ef1dbeaf144c8f4a9a8a7c20b7e8e0e80a9879641991e143fcab1e,1 b0cb804bdd6f90298e5666ceab7d996ce4091a979042f16e37a1c91172ef4557,1,311
1d29f78faa17a8e4eedf768a3030cf2fa869adf9073970114a10ac1ffbf25dd3,1 0c13bbd461d3db182993b778b93cff731b065067abc5c5c8f915ed40c1eb65d8,1,395
5da8d831d2592df14f490eb54088c42663b8a4d8a2e11321e2d1c3b62f04759e,1 bd4385ceb9fa005abcd9f4b42676585831e7ded220cf603a6e350d0737d66721,1,313
7515d03f2e9a830e28f159fe83780d4547474e2dc3cbd78021d3aafb7146ad41,1 802b91f4135c02402cf0e58cfc5206aa94a0d07a17ec25fef265d8f99c73e94b,1,82
312d7604449ec7d5eedbc7c13657b36d524e855fc40a0e96dd2a2d1a5bf6d871,1 6e77b321eb0723af05567317e43f8ea8ba3213162b83f6cb6252ba1f9fc9f04b,1,556
fafd6671c7abedcc9c3eeb5515222986bd375b2092b33b3cb18d6cb7c651e12f,1 7a883bf90b8eb08649f093c1238964b3fca760ed267a7f52521c5f4af9dd0670,1,185
09e008c475537da36f81d5e0f445cb4b9b38fc0cb97f1a2ce4e4daa41c2ad781,1 4a47ecc322ef6398e4e3a763309db37c53f41a35795c92c0a9ef895b2ce7d784,1,282
7f8bf9ac61f419262426d3e5e318967e28677d727f258c94287ebf3e2186b81b,1 ddc3ae9ea8157603c8e66f993da63508de6fd3885f63ddd7212357389bdadd36,1,358
fd5abc4804cc0940257599f0d18d2ba003c76c18f6352c44f1547f8cc30e4c82,1 9a5f6e6c3f3f481487d241859dbce5e9babe5899e70be03e569fca2fbaeb6754,1,479
c0755de7d2d778774ce46a918f7f4c676ca1eaddf2ea4a4f84dd3cc47681c5bf,1 e18cffeca4cb1b29b85263a8cb035e9f55380300d4775093e9d54718265fe851,1,301
cb1c3e8c9b713e538041a83dbf0511e3713556e581e5a03e35d951a84b91a68c,1 1daa5a5ecf1af2c219d9dc0a7c63c05cf11d1268fb4d69aa3f885dd76d53f534,1,258
8bb6acc4357d2600e46ad4f041b498ee1c728ca744627f8d20eb15f20cffa30f,1 f36c343b19249689b7282698e68427e3fcc7d9266fede603c3808d09748f8505,1,133
dda246f075c6662652e4effb4f9ffed4b89392b0a3db06bb845f995d1211124a,1 c3e8d1aa58ab905ff2d758bff724f23fd0cded6ba978522240accfe282e2a988,1,569
1b27e236c1643f185598e1723af4a21d4a2f951e3bebf33ba26c9ea66ef8d044,1 101eb5a049cdf365a7fdab8306ffecd7fb26fc82708832904572602d8ace71f2,1,284
3776fba77225895c176d7b1a56849fc1af7916503f63e82b54651296abd8816e,1 5ec1e6153eb5dd188973576ac70a1de62cd22be3c51440f47216c5d4f4325db8,1,566
4333258b2c6f4570d1296d2d3fdf5123f5e04f23f4d17d52ac37ab0b6e241128,1 d4f8f2cf01512a7553c1b45162b7a82383afb0506aefa3ff83928644e726f0e9,1,73
c248ac32f6516ab3b793f88b890dcf963d0e8fae8a1eeea11b97a5bab0b35866,1 c9f5cee4ccb94b5fda742c96270abc003999d506ccef70771be263071bc79663,1,45
a737438ea620782d8ff55af6954e16f0e78ea1a37544bad0c105053e6a7dc9f0,1 9bcf8323471814bbb1ed57331e8399ff71e0bb51bf6333848a221f859329715f,1,139
5bda9c8ede2c6debf1169c3879eb789f175090ec657c14b229f8fc991a7c0639,1 43240ec669165ddb00f85ded365c20421310a3120e9f377debc091c9b9a714e5,1,236
Source diff could not be displayed: it is too large. Options to address this: view the blob.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment