Compare commits
12 Commits
23c2a3e1c6
...
5a132799a4
Author | SHA1 | Date | |
---|---|---|---|
5a132799a4 | |||
72469ebb6e | |||
6c79847a42 | |||
405a2ca161 | |||
f93466316a | |||
5626cd09d9 | |||
41840220c3 | |||
7ff00e7846 | |||
6242f40d48 | |||
403d70a1d3 | |||
9763452713 | |||
73d0593fca |
270
ConflictSet.cpp
270
ConflictSet.cpp
@@ -800,7 +800,6 @@ struct WriteContext {
|
||||
int64_t nodes_allocated;
|
||||
int64_t nodes_released;
|
||||
int64_t point_writes;
|
||||
int64_t prefix_writes;
|
||||
int64_t range_writes;
|
||||
int64_t write_bytes;
|
||||
} accum;
|
||||
@@ -1605,6 +1604,46 @@ void rezero(Node *n, InternalVersionT z) {
|
||||
}
|
||||
}
|
||||
|
||||
void mergeWithChild(Node *&self, WriteContext *tls, ConflictSet::Impl *impl,
|
||||
Node *&dontInvalidate, Node3 *self3) {
|
||||
assert(!self3->entryPresent);
|
||||
auto *child = self3->children[0];
|
||||
int minCapacity = self3->partialKeyLen + 1 + child->partialKeyLen;
|
||||
|
||||
if (minCapacity > child->getCapacity()) {
|
||||
const bool update = child == dontInvalidate;
|
||||
freeAndMakeCapacityAtLeast(child, minCapacity, tls, impl, true);
|
||||
if (update) {
|
||||
dontInvalidate = child;
|
||||
}
|
||||
}
|
||||
|
||||
// Merge partial key with child
|
||||
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||
fprintf(stderr, "Merge %s into %s\n", getSearchPathPrintable(self).c_str(),
|
||||
getSearchPathPrintable(child).c_str());
|
||||
#endif
|
||||
|
||||
InternalVersionT childMaxVersion = self3->childMaxVersion[0];
|
||||
|
||||
// Construct new partial key for child
|
||||
memmove(child->partialKey() + self3->partialKeyLen + 1, child->partialKey(),
|
||||
child->partialKeyLen);
|
||||
memcpy(child->partialKey(), self3->partialKey(), self->partialKeyLen);
|
||||
child->partialKey()[self3->partialKeyLen] = self3->index[0];
|
||||
child->partialKeyLen += 1 + self3->partialKeyLen;
|
||||
|
||||
child->parent = self->parent;
|
||||
child->parentsIndex = self->parentsIndex;
|
||||
|
||||
// Max versions are stored in the parent, so we need to update it now
|
||||
// that we have a new parent.
|
||||
setMaxVersion(child, impl, std::max(childMaxVersion, tls->zero));
|
||||
|
||||
self = child;
|
||||
tls->release(self3);
|
||||
}
|
||||
|
||||
void maybeDownsize(Node *self, WriteContext *tls, ConflictSet::Impl *impl,
|
||||
Node *&dontInvalidate) {
|
||||
|
||||
@@ -1624,45 +1663,7 @@ void maybeDownsize(Node *self, WriteContext *tls, ConflictSet::Impl *impl,
|
||||
getInTree(self, impl) = newSelf;
|
||||
tls->release(self3);
|
||||
} else if (self->numChildren == 1 && !self->entryPresent) {
|
||||
auto *child = self3->children[0];
|
||||
int minCapacity = self3->partialKeyLen + 1 + child->partialKeyLen;
|
||||
|
||||
if (minCapacity > child->getCapacity()) {
|
||||
const bool update = child == dontInvalidate;
|
||||
freeAndMakeCapacityAtLeast(child, minCapacity, tls, impl, true);
|
||||
if (update) {
|
||||
dontInvalidate = child;
|
||||
}
|
||||
}
|
||||
|
||||
// Merge partial key with child
|
||||
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||
fprintf(stderr, "Merge %s into %s\n",
|
||||
getSearchPathPrintable(self).c_str(),
|
||||
getSearchPathPrintable(child).c_str());
|
||||
#endif
|
||||
|
||||
InternalVersionT childMaxVersion = maxVersion(child, impl);
|
||||
|
||||
// Construct new partial key for child
|
||||
memmove(child->partialKey() + self3->partialKeyLen + 1,
|
||||
child->partialKey(), child->partialKeyLen);
|
||||
memcpy(child->partialKey(), self3->partialKey(), self->partialKeyLen);
|
||||
child->partialKey()[self3->partialKeyLen] = self3->index[0];
|
||||
child->partialKeyLen += 1 + self3->partialKeyLen;
|
||||
|
||||
child->parent = self->parent;
|
||||
child->parentsIndex = self->parentsIndex;
|
||||
|
||||
// Max versions are stored in the parent, so we need to update it now
|
||||
// that we have a new parent.
|
||||
setMaxVersion(child, impl, childMaxVersion);
|
||||
if (child->parent) {
|
||||
rezero(child->parent, tls->zero);
|
||||
}
|
||||
|
||||
getInTree(self, impl) = child;
|
||||
tls->release(self3);
|
||||
mergeWithChild(getInTree(self, impl), tls, impl, dontInvalidate, self3);
|
||||
}
|
||||
} break;
|
||||
case Type_Node16:
|
||||
@@ -1828,7 +1829,7 @@ void eraseBetween(Node **inTree, Node16 *n, int begin, int end,
|
||||
n->index[i] = n->index[i + count];
|
||||
}
|
||||
|
||||
if (n->numChildren > Node3::kMaxNodes) {
|
||||
if (n->numChildren + n->entryPresent >= kMinChildrenNode16) {
|
||||
// nop
|
||||
} else if (n->numChildren > 0) {
|
||||
auto *newNode = tls->allocate<Node3>(n->partialKeyLen);
|
||||
@@ -1868,7 +1869,7 @@ void eraseBetween(Node **inTree, Node48 *n, int begin, int end,
|
||||
--n->numChildren;
|
||||
}
|
||||
|
||||
if (n->numChildren > Node16::kMaxNodes) {
|
||||
if (n->numChildren + n->entryPresent >= kMinChildrenNode48) {
|
||||
// nop
|
||||
} else if (n->numChildren > Node3::kMaxNodes) {
|
||||
auto *newNode = tls->allocate<Node16>(n->partialKeyLen);
|
||||
@@ -1897,7 +1898,7 @@ void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
|
||||
n->bitSet.reset(i);
|
||||
--n->numChildren;
|
||||
}
|
||||
if (n->numChildren > Node48::kMaxNodes) {
|
||||
if (n->numChildren + n->entryPresent >= kMinChildrenNode256) {
|
||||
// nop
|
||||
} else if (n->numChildren > Node16::kMaxNodes) {
|
||||
auto *newNode = tls->allocate<Node48>(n->partialKeyLen);
|
||||
@@ -1923,7 +1924,9 @@ void eraseBetween(Node **inTree, Node256 *n, int begin, int end,
|
||||
}
|
||||
|
||||
// Erase all nodes with a search path starting with n + [child],
|
||||
// where child in [begin, end).
|
||||
// where child in [begin, end). To avoid the need to propagate erases up the
|
||||
// search path, the caller must ensure that the result has at least one child or
|
||||
// has entryPresent.
|
||||
void eraseBetween(Node *&n, int begin, int end, WriteContext *tls) {
|
||||
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||
fprintf(stderr, "eraseBetween: %s + [%d,%d)\n",
|
||||
@@ -1947,6 +1950,7 @@ void eraseBetween(Node *&n, int begin, int end, WriteContext *tls) {
|
||||
default: // GCOVR_EXCL_LINE
|
||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||
}
|
||||
assert(n->numChildren > 0 || n->entryPresent);
|
||||
}
|
||||
|
||||
// Precondition: self is not the root. May invalidate nodes along the search
|
||||
@@ -3188,55 +3192,6 @@ void fixupMaxVersion(Node *node, ConflictSet::Impl *impl, WriteContext *tls) {
|
||||
setMaxVersion(node, impl, max);
|
||||
}
|
||||
|
||||
void addPrefixWrite(Node *&root, std::span<const uint8_t> begin,
|
||||
std::span<const uint8_t> end, InternalVersionT writeVersion,
|
||||
WriteContext *tls, ConflictSet::Impl *impl) {
|
||||
++tls->accum.prefix_writes;
|
||||
int lcp = begin.size() - 1;
|
||||
|
||||
Node **useAsRoot =
|
||||
insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl);
|
||||
|
||||
auto *beginNode =
|
||||
*insert(useAsRoot, begin.subspan(lcp, 1), writeVersion, tls, impl);
|
||||
|
||||
const bool insertedBegin = !beginNode->entryPresent;
|
||||
|
||||
addKey(beginNode);
|
||||
beginNode->entryPresent = true;
|
||||
|
||||
if (insertedBegin) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(beginNode);
|
||||
beginNode->entry.rangeVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
beginNode->entry.pointVersion = writeVersion;
|
||||
}
|
||||
assert(writeVersion >= beginNode->entry.pointVersion);
|
||||
beginNode->entry.pointVersion = writeVersion;
|
||||
|
||||
auto *endNode =
|
||||
*insert(useAsRoot, end.subspan(lcp, 1), writeVersion, tls, impl);
|
||||
|
||||
const bool insertedEnd = !endNode->entryPresent;
|
||||
|
||||
addKey(endNode);
|
||||
endNode->entryPresent = true;
|
||||
|
||||
if (insertedEnd) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(endNode);
|
||||
endNode->entry.pointVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
}
|
||||
endNode->entry.rangeVersion = writeVersion;
|
||||
|
||||
eraseBetween(getInTree(beginNode, impl), 0, 256, tls);
|
||||
|
||||
// Inserting end trashed endNode's maxVersion. Fix that
|
||||
fixupMaxVersion(endNode, impl, tls);
|
||||
}
|
||||
|
||||
void addWriteRange(Node *&root, std::span<const uint8_t> begin,
|
||||
std::span<const uint8_t> end, InternalVersionT writeVersion,
|
||||
WriteContext *tls, ConflictSet::Impl *impl) {
|
||||
@@ -3247,68 +3202,98 @@ void addWriteRange(Node *&root, std::span<const uint8_t> begin,
|
||||
end.back() == 0) {
|
||||
return addPointWrite(root, begin, writeVersion, tls, impl);
|
||||
}
|
||||
if (lcp == int(begin.size() - 1) && end.size() == begin.size() &&
|
||||
int(begin.back()) + 1 == int(end.back())) {
|
||||
return addPrefixWrite(root, begin, end, writeVersion, tls, impl);
|
||||
}
|
||||
++tls->accum.range_writes;
|
||||
const bool beginIsPrefix = lcp == int(begin.size());
|
||||
|
||||
Node **useAsRoot =
|
||||
insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl);
|
||||
begin = begin.subspan(lcp, begin.size() - lcp);
|
||||
end = end.subspan(lcp, end.size() - lcp);
|
||||
|
||||
int consumed = lcp;
|
||||
|
||||
begin = begin.subspan(consumed, begin.size() - consumed);
|
||||
end = end.subspan(consumed, end.size() - consumed);
|
||||
|
||||
auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl);
|
||||
|
||||
const bool insertedBegin = !beginNode->entryPresent;
|
||||
|
||||
addKey(beginNode);
|
||||
beginNode->entryPresent = true;
|
||||
|
||||
if (insertedBegin) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(beginNode);
|
||||
beginNode->entry.rangeVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
if (beginIsPrefix) {
|
||||
auto *beginNode = *useAsRoot;
|
||||
addKey(beginNode);
|
||||
if (!beginNode->entryPresent) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(beginNode);
|
||||
beginNode->entry.rangeVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
beginNode->entryPresent = true;
|
||||
}
|
||||
beginNode->entry.pointVersion = writeVersion;
|
||||
}
|
||||
assert(writeVersion >= beginNode->entry.pointVersion);
|
||||
beginNode->entry.pointVersion = writeVersion;
|
||||
|
||||
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
|
||||
|
||||
const bool insertedEnd = !endNode->entryPresent;
|
||||
|
||||
addKey(endNode);
|
||||
endNode->entryPresent = true;
|
||||
|
||||
if (insertedEnd) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(endNode);
|
||||
endNode->entry.pointVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
if (beginIsPrefix) {
|
||||
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
|
||||
addKey(endNode);
|
||||
if (!endNode->entryPresent) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(endNode);
|
||||
endNode->entry.pointVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
// beginNode may have been invalidated when inserting end
|
||||
beginNode = *useAsRoot;
|
||||
assert(beginNode->entryPresent);
|
||||
endNode->entryPresent = true;
|
||||
}
|
||||
}
|
||||
endNode->entry.rangeVersion = writeVersion;
|
||||
endNode->entry.rangeVersion = writeVersion;
|
||||
|
||||
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
||||
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
||||
}
|
||||
|
||||
// Inserting end trashed endNode's maxVersion. Fix that
|
||||
fixupMaxVersion(endNode, impl, tls);
|
||||
} else /*!beginIsPrefix*/ {
|
||||
auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl);
|
||||
addKey(beginNode);
|
||||
if (!beginNode->entryPresent) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(beginNode);
|
||||
beginNode->entry.rangeVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
beginNode->entryPresent = true;
|
||||
}
|
||||
beginNode->entry.pointVersion = writeVersion;
|
||||
|
||||
auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl);
|
||||
addKey(endNode);
|
||||
if (!endNode->entryPresent) {
|
||||
++tls->accum.entries_inserted;
|
||||
auto *p = nextLogical(endNode);
|
||||
endNode->entry.pointVersion =
|
||||
p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero);
|
||||
endNode->entryPresent = true;
|
||||
}
|
||||
endNode->entry.rangeVersion = writeVersion;
|
||||
|
||||
if (!beginIsPrefix) {
|
||||
eraseBetween(*useAsRoot, begin[0] + 1, end[0], tls);
|
||||
}
|
||||
|
||||
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
||||
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
||||
}
|
||||
// // Erase along left spine
|
||||
// for (auto [n, key] = std::make_tuple(useAsRoot, begin);;) {
|
||||
// auto before = key;
|
||||
// auto **child = &getOrCreateChild(*n, key, writeVersion, tls);
|
||||
// if (key.size() > 0) {
|
||||
// eraseBetween(*child, int(key[0]) + 1, 256, tls);
|
||||
// if ((*child)->numChildren == 1 && !(*child)->entryPresent) {
|
||||
// Node *dummy = nullptr;
|
||||
// mergeWithChild(*child, tls, impl, dummy,
|
||||
// static_cast<Node3 *>(*child));
|
||||
// key = before;
|
||||
// continue;
|
||||
// }
|
||||
// } else {
|
||||
// eraseBetween(*child, 0, 256, tls);
|
||||
// beginNode = *child;
|
||||
// break;
|
||||
// }
|
||||
// n = child;
|
||||
// }
|
||||
|
||||
// Inserting end trashed endNode's maxVersion. Fix that
|
||||
fixupMaxVersion(endNode, impl, tls);
|
||||
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
||||
beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) {
|
||||
}
|
||||
|
||||
// Inserting end trashed endNode's maxVersion. Fix that
|
||||
fixupMaxVersion(endNode, impl, tls);
|
||||
}
|
||||
}
|
||||
|
||||
Node *firstGeqPhysical(Node *n, const std::span<const uint8_t> key) {
|
||||
@@ -3457,7 +3442,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
|
||||
memory_bytes.set(totalBytes);
|
||||
point_writes_total.add(tls.accum.point_writes);
|
||||
prefix_writes_total.add(tls.accum.prefix_writes);
|
||||
range_writes_total.add(tls.accum.range_writes);
|
||||
nodes_allocated_total.add(tls.accum.nodes_allocated);
|
||||
nodes_released_total.add(tls.accum.nodes_released);
|
||||
@@ -3656,7 +3640,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||
"Total number of checks where the result is \"too old\"");
|
||||
COUNTER(check_bytes_total, "Total number of key bytes checked");
|
||||
COUNTER(point_writes_total, "Total number of point writes");
|
||||
COUNTER(prefix_writes_total, "Total number of prefix writes");
|
||||
COUNTER(range_writes_total, "Total number of range writes");
|
||||
GAUGE(memory_bytes, "Total number of bytes in use");
|
||||
COUNTER(nodes_allocated_total,
|
||||
@@ -3764,6 +3747,7 @@ InternalVersionT exchangeMaxVersion(Node *n, InternalVersionT newMax) {
|
||||
}
|
||||
|
||||
void setMaxVersion(Node *n, ConflictSet::Impl *impl, InternalVersionT newMax) {
|
||||
assert(newMax >= InternalVersionT::zero);
|
||||
int index = n->parentsIndex;
|
||||
n = n->parent;
|
||||
if (n == nullptr) {
|
||||
@@ -4274,7 +4258,7 @@ checkMaxVersion(Node *root, Node *node, InternalVersionT oldestVersion,
|
||||
bool success = true;
|
||||
|
||||
if (node->partialKeyLen > 0) {
|
||||
fprintf(stderr, "Root cannot have a partial key");
|
||||
fprintf(stderr, "Root cannot have a partial key\n");
|
||||
success = false;
|
||||
}
|
||||
checkParentPointers(node, success);
|
||||
|
@@ -164,6 +164,63 @@ double toSeconds(timeval t) {
|
||||
return double(t.tv_sec) + double(t.tv_usec) * 1e-6;
|
||||
}
|
||||
|
||||
#include <linux/perf_event.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __linux__
|
||||
struct PerfCounter {
|
||||
explicit PerfCounter(int event) {
|
||||
struct perf_event_attr pe;
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
pe.type = PERF_TYPE_HARDWARE;
|
||||
pe.size = sizeof(pe);
|
||||
pe.config = event;
|
||||
pe.inherit = 1;
|
||||
pe.exclude_kernel = 1;
|
||||
pe.exclude_hv = 1;
|
||||
|
||||
fd = perf_event_open(&pe, 0, -1, -1, 0);
|
||||
if (fd == -1) {
|
||||
fprintf(stderr, "Error opening leader %llx\n", pe.config);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
int64_t total() {
|
||||
int64_t count;
|
||||
if (read(fd, &count, sizeof(count)) != sizeof(count)) {
|
||||
perror("read instructions from perf");
|
||||
abort();
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
~PerfCounter() { close(fd); }
|
||||
|
||||
private:
|
||||
int fd;
|
||||
static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
|
||||
int cpu, int group_fd, unsigned long flags) {
|
||||
int ret;
|
||||
|
||||
ret = syscall(SYS_perf_event_open, hw_event, pid, cpu, group_fd, flags);
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
#else
|
||||
struct PerfCounter {
|
||||
explicit PerPerfCounter(int) {}
|
||||
int64_t total() { return 0; }
|
||||
};
|
||||
#endif
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc != 3) {
|
||||
goto fail;
|
||||
@@ -176,6 +233,8 @@ int main(int argc, char **argv) {
|
||||
int metricsCount;
|
||||
cs.getMetricsV1(&metrics, &metricsCount);
|
||||
|
||||
PerfCounter instructions{PERF_COUNT_HW_INSTRUCTIONS};
|
||||
PerfCounter cycles{PERF_COUNT_HW_CPU_CYCLES};
|
||||
auto w = std::thread{workload, &cs};
|
||||
|
||||
for (;;) {
|
||||
@@ -203,6 +262,16 @@ int main(int argc, char **argv) {
|
||||
"transactions_total ";
|
||||
body += std::to_string(transactions.load(std::memory_order_relaxed));
|
||||
body += "\n";
|
||||
body += "# HELP instructions_total Total number of instructions\n"
|
||||
"# TYPE instructions_total counter\n"
|
||||
"instructions_total ";
|
||||
body += std::to_string(instructions.total());
|
||||
body += "\n";
|
||||
body += "# HELP cycles_total Total number of cycles\n"
|
||||
"# TYPE cycles_total counter\n"
|
||||
"cycles_total ";
|
||||
body += std::to_string(cycles.total());
|
||||
body += "\n";
|
||||
|
||||
for (int i = 0; i < metricsCount; ++i) {
|
||||
body += "# HELP ";
|
||||
|
BIN
corpus/00109d195ce4e826feb08448d822f7ad925fa763
Normal file
BIN
corpus/00109d195ce4e826feb08448d822f7ad925fa763
Normal file
Binary file not shown.
BIN
corpus/04d8a5799db6740450a758d973610b39719493dd
Normal file
BIN
corpus/04d8a5799db6740450a758d973610b39719493dd
Normal file
Binary file not shown.
BIN
corpus/0594eed24298634b028ccafaf284afb5a6acf940
Normal file
BIN
corpus/0594eed24298634b028ccafaf284afb5a6acf940
Normal file
Binary file not shown.
BIN
corpus/14675a1f433ad02a993ee402c562f19b39a69896
Normal file
BIN
corpus/14675a1f433ad02a993ee402c562f19b39a69896
Normal file
Binary file not shown.
BIN
corpus/15ef9579e5fa538b38b74e134c86bbfce4eea462
Normal file
BIN
corpus/15ef9579e5fa538b38b74e134c86bbfce4eea462
Normal file
Binary file not shown.
BIN
corpus/1e0cc87f3aeef1f66b1cf58007854fc5404e5700
Normal file
BIN
corpus/1e0cc87f3aeef1f66b1cf58007854fc5404e5700
Normal file
Binary file not shown.
BIN
corpus/1ec9a7689eceb2a68b703619c6302147f258d088
Normal file
BIN
corpus/1ec9a7689eceb2a68b703619c6302147f258d088
Normal file
Binary file not shown.
BIN
corpus/1f4bd753e184a7e81d0c26b43ca18a3e8cfee86f
Normal file
BIN
corpus/1f4bd753e184a7e81d0c26b43ca18a3e8cfee86f
Normal file
Binary file not shown.
BIN
corpus/248bb4518929f33a266eae8e1d233958f7330198
Normal file
BIN
corpus/248bb4518929f33a266eae8e1d233958f7330198
Normal file
Binary file not shown.
BIN
corpus/2f52518baf38b56e013170e88f40705c4c62fdf8
Normal file
BIN
corpus/2f52518baf38b56e013170e88f40705c4c62fdf8
Normal file
Binary file not shown.
BIN
corpus/3b1b54256c016f3ef2c5b82811937d1c1fa19a04
Normal file
BIN
corpus/3b1b54256c016f3ef2c5b82811937d1c1fa19a04
Normal file
Binary file not shown.
BIN
corpus/3e32897a108d7df921659463f5ba301634bc278c
Normal file
BIN
corpus/3e32897a108d7df921659463f5ba301634bc278c
Normal file
Binary file not shown.
BIN
corpus/3f6efe293f6347c0d960918e84a7adc5341d5295
Normal file
BIN
corpus/3f6efe293f6347c0d960918e84a7adc5341d5295
Normal file
Binary file not shown.
BIN
corpus/44038657af1b2a3398a0c39bcab8f6e4b24d218d
Normal file
BIN
corpus/44038657af1b2a3398a0c39bcab8f6e4b24d218d
Normal file
Binary file not shown.
BIN
corpus/459d9bc23bfdabdf74fba5f5847e607e58dc4db8
Normal file
BIN
corpus/459d9bc23bfdabdf74fba5f5847e607e58dc4db8
Normal file
Binary file not shown.
BIN
corpus/483b083c153baea1a8ab33f45ba4e9e557e393c0
Normal file
BIN
corpus/483b083c153baea1a8ab33f45ba4e9e557e393c0
Normal file
Binary file not shown.
BIN
corpus/496e3f23a395a7d97a97cc85579cbc62c81b235a
Normal file
BIN
corpus/496e3f23a395a7d97a97cc85579cbc62c81b235a
Normal file
Binary file not shown.
BIN
corpus/4f5e9ed1806b5af386b7e83b28f4899944077798
Normal file
BIN
corpus/4f5e9ed1806b5af386b7e83b28f4899944077798
Normal file
Binary file not shown.
BIN
corpus/694981aecb0b085aaa439bf9060bb9963a3cbc1c
Normal file
BIN
corpus/694981aecb0b085aaa439bf9060bb9963a3cbc1c
Normal file
Binary file not shown.
BIN
corpus/738b50c663d76c1a388b8c924c525f6b379584b5
Normal file
BIN
corpus/738b50c663d76c1a388b8c924c525f6b379584b5
Normal file
Binary file not shown.
BIN
corpus/759e6f65d0f4d3a77b93e7d975786255e32026bd
Normal file
BIN
corpus/759e6f65d0f4d3a77b93e7d975786255e32026bd
Normal file
Binary file not shown.
BIN
corpus/765ebb331233de0c5564be9d3ead01b344272093
Normal file
BIN
corpus/765ebb331233de0c5564be9d3ead01b344272093
Normal file
Binary file not shown.
BIN
corpus/77cbfb5d27c19ee3a90a9fefdfcc6c9e1a511d16
Normal file
BIN
corpus/77cbfb5d27c19ee3a90a9fefdfcc6c9e1a511d16
Normal file
Binary file not shown.
BIN
corpus/7da1ebc7b5e251c9f1685ef6bdf61130db7ec06b
Normal file
BIN
corpus/7da1ebc7b5e251c9f1685ef6bdf61130db7ec06b
Normal file
Binary file not shown.
BIN
corpus/8b424a838a30bacef141ede5b487d9b4fd1d3b5c
Normal file
BIN
corpus/8b424a838a30bacef141ede5b487d9b4fd1d3b5c
Normal file
Binary file not shown.
BIN
corpus/8c23fc1b51f8b70f959cb22e0cb050d5e077c37e
Normal file
BIN
corpus/8c23fc1b51f8b70f959cb22e0cb050d5e077c37e
Normal file
Binary file not shown.
BIN
corpus/98798c935df0d24c46d56b6c9ebf3aec1996e74c
Normal file
BIN
corpus/98798c935df0d24c46d56b6c9ebf3aec1996e74c
Normal file
Binary file not shown.
BIN
corpus/a0de49bb69c8c6be8a6fe118bd9d11056f4c2de9
Normal file
BIN
corpus/a0de49bb69c8c6be8a6fe118bd9d11056f4c2de9
Normal file
Binary file not shown.
BIN
corpus/a3d3d78aa99ba78b5cffeadb70d58b29a42fe684
Normal file
BIN
corpus/a3d3d78aa99ba78b5cffeadb70d58b29a42fe684
Normal file
Binary file not shown.
BIN
corpus/a9b6947982019f6b37c1deb71cd9f3902c22d4ca
Normal file
BIN
corpus/a9b6947982019f6b37c1deb71cd9f3902c22d4ca
Normal file
Binary file not shown.
BIN
corpus/b6196f90a21b5864a82abd65869a95ea95edcbb5
Normal file
BIN
corpus/b6196f90a21b5864a82abd65869a95ea95edcbb5
Normal file
Binary file not shown.
BIN
corpus/be016ef36ff52f734fdb934a6e1700c5c070237e
Normal file
BIN
corpus/be016ef36ff52f734fdb934a6e1700c5c070237e
Normal file
Binary file not shown.
BIN
corpus/cc5d02482039196eff2e48b14e2b8a6c56eea8a4
Normal file
BIN
corpus/cc5d02482039196eff2e48b14e2b8a6c56eea8a4
Normal file
Binary file not shown.
BIN
corpus/d2e2ff0b99934dc6419d9e77faae6b1b7d719daf
Normal file
BIN
corpus/d2e2ff0b99934dc6419d9e77faae6b1b7d719daf
Normal file
Binary file not shown.
BIN
corpus/d4acf46027cb52a5926903e71e93db19903456ea
Normal file
BIN
corpus/d4acf46027cb52a5926903e71e93db19903456ea
Normal file
Binary file not shown.
BIN
corpus/e365a2f85018d579029e3870450ddd7008747f11
Normal file
BIN
corpus/e365a2f85018d579029e3870450ddd7008747f11
Normal file
Binary file not shown.
BIN
corpus/e6fa3770cf460c3211063414d4a4aa18ed7717c1
Normal file
BIN
corpus/e6fa3770cf460c3211063414d4a4aa18ed7717c1
Normal file
Binary file not shown.
BIN
corpus/eea11cb6b4437b56365bfd4876f40d6bbf37dfcd
Normal file
BIN
corpus/eea11cb6b4437b56365bfd4876f40d6bbf37dfcd
Normal file
Binary file not shown.
Reference in New Issue
Block a user