Compare commits
4 Commits
4b6b2747bf
...
5371c2bede
Author | SHA1 | Date | |
---|---|---|---|
5371c2bede | |||
75c304bbe7 | |||
aefb83dbc6 | |||
b0ac7e41b9 |
122
ConflictSet.cpp
122
ConflictSet.cpp
@@ -259,19 +259,26 @@ struct Node256 : Node {
|
|||||||
uint8_t *partialKey() { return (uint8_t *)(this + 1); }
|
uint8_t *partialKey() { return (uint8_t *)(this + 1); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::string getSearchPathPrintable(Node *n);
|
||||||
|
}
|
||||||
|
|
||||||
// Bound memory usage following the analysis in the ART paper
|
// Bound memory usage following the analysis in the ART paper
|
||||||
|
|
||||||
constexpr int kBytesPerKey = 121;
|
constexpr int kBytesPerKey = 120;
|
||||||
constexpr int kMinChildrenNode4 = 1;
|
constexpr int kMinChildrenNode4 = 2;
|
||||||
constexpr int kMinChildrenNode16 = 5;
|
constexpr int kMinChildrenNode16 = 5;
|
||||||
constexpr int kMinChildrenNode48 = 17;
|
constexpr int kMinChildrenNode48 = 17;
|
||||||
constexpr int kMinChildrenNode256 = 49;
|
constexpr int kMinChildrenNode256 = 49;
|
||||||
|
|
||||||
static_assert(sizeof(Node256) < kMinChildrenNode256 * kBytesPerKey);
|
static_assert(sizeof(Node256) + kBytesPerKey <=
|
||||||
static_assert(sizeof(Node48) < kMinChildrenNode48 * kBytesPerKey);
|
kMinChildrenNode256 * kBytesPerKey);
|
||||||
static_assert(sizeof(Node16) < kMinChildrenNode16 * kBytesPerKey);
|
static_assert(sizeof(Node48) + kBytesPerKey <=
|
||||||
static_assert(sizeof(Node4) < kMinChildrenNode4 * kBytesPerKey);
|
kMinChildrenNode48 * kBytesPerKey);
|
||||||
static_assert(sizeof(Node0) < kBytesPerKey);
|
static_assert(sizeof(Node16) + kBytesPerKey <=
|
||||||
|
kMinChildrenNode16 * kBytesPerKey);
|
||||||
|
static_assert(sizeof(Node4) + kBytesPerKey <= kMinChildrenNode4 * kBytesPerKey);
|
||||||
|
static_assert(sizeof(Node0) <= kBytesPerKey);
|
||||||
|
|
||||||
// setOldestVersion will additionally try to maintain this property:
|
// setOldestVersion will additionally try to maintain this property:
|
||||||
// `max(children, 1) * length >= capacity`
|
// `max(children, 1) * length >= capacity`
|
||||||
@@ -736,21 +743,14 @@ Node *nextLogical(Node *node) {
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix larger-than-desired capacities. Does not return nodes to freelists,
|
// Invalidates `self`, replacing it with a node of at least capacity.
|
||||||
// since that wouldn't actually reclaim the memory used for partial key
|
// Does not return nodes to freelists.
|
||||||
// capacity.
|
void makeCapacityAtLeast(Node *&self, int capacity, NodeAllocators *allocators,
|
||||||
void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
|
||||||
ConflictSet::Impl *impl) {
|
ConflictSet::Impl *impl) {
|
||||||
const int maxCapacity =
|
|
||||||
std::max<int>(self->numChildren, 1) * self->partialKeyLen;
|
|
||||||
if (self->partialKeyCapacity <= maxCapacity) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (self->type) {
|
switch (self->type) {
|
||||||
case Type::Node0: {
|
case Type::Node0: {
|
||||||
auto *self0 = (Node0 *)self;
|
auto *self0 = (Node0 *)self;
|
||||||
auto *newSelf = allocators->node0.allocate(maxCapacity);
|
auto *newSelf = allocators->node0.allocate(capacity);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
kNodeCopySize);
|
kNodeCopySize);
|
||||||
memcpy(newSelf->partialKey(), self0->partialKey(), self->partialKeyLen);
|
memcpy(newSelf->partialKey(), self0->partialKey(), self->partialKeyLen);
|
||||||
@@ -760,7 +760,7 @@ void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
|||||||
} break;
|
} break;
|
||||||
case Type::Node4: {
|
case Type::Node4: {
|
||||||
auto *self4 = (Node4 *)self;
|
auto *self4 = (Node4 *)self;
|
||||||
auto *newSelf = allocators->node4.allocate(maxCapacity);
|
auto *newSelf = allocators->node4.allocate(capacity);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
kNodeCopySize);
|
kNodeCopySize);
|
||||||
memcpy(newSelf->partialKey(), self4->partialKey(), self->partialKeyLen);
|
memcpy(newSelf->partialKey(), self4->partialKey(), self->partialKeyLen);
|
||||||
@@ -776,7 +776,7 @@ void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
|||||||
} break;
|
} break;
|
||||||
case Type::Node16: {
|
case Type::Node16: {
|
||||||
auto *self16 = (Node16 *)self;
|
auto *self16 = (Node16 *)self;
|
||||||
auto *newSelf = allocators->node16.allocate(maxCapacity);
|
auto *newSelf = allocators->node16.allocate(capacity);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
kNodeCopySize);
|
kNodeCopySize);
|
||||||
memcpy(newSelf->partialKey(), self16->partialKey(), self->partialKeyLen);
|
memcpy(newSelf->partialKey(), self16->partialKey(), self->partialKeyLen);
|
||||||
@@ -792,7 +792,7 @@ void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
|||||||
} break;
|
} break;
|
||||||
case Type::Node48: {
|
case Type::Node48: {
|
||||||
auto *self48 = (Node48 *)self;
|
auto *self48 = (Node48 *)self;
|
||||||
auto *newSelf = allocators->node48.allocate(maxCapacity);
|
auto *newSelf = allocators->node48.allocate(capacity);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
kNodeCopySize);
|
kNodeCopySize);
|
||||||
memcpy(newSelf->partialKey(), self48->partialKey(), self->partialKeyLen);
|
memcpy(newSelf->partialKey(), self48->partialKey(), self->partialKeyLen);
|
||||||
@@ -812,7 +812,7 @@ void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
|||||||
} break;
|
} break;
|
||||||
case Type::Node256: {
|
case Type::Node256: {
|
||||||
auto *self256 = (Node256 *)self;
|
auto *self256 = (Node256 *)self;
|
||||||
auto *newSelf = allocators->node256.allocate(maxCapacity);
|
auto *newSelf = allocators->node256.allocate(capacity);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
kNodeCopySize);
|
kNodeCopySize);
|
||||||
memcpy(newSelf->partialKey(), self256->partialKey(), self->partialKeyLen);
|
memcpy(newSelf->partialKey(), self256->partialKey(), self->partialKeyLen);
|
||||||
@@ -827,9 +827,27 @@ void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix larger-than-desired capacities. Does not return nodes to freelists,
|
||||||
|
// since that wouldn't actually reclaim the memory used for partial key
|
||||||
|
// capacity.
|
||||||
|
void maybeDecreaseCapacity(Node *&self, NodeAllocators *allocators,
|
||||||
|
ConflictSet::Impl *impl) {
|
||||||
|
const int maxCapacity =
|
||||||
|
std::max<int>(self->numChildren, 1) * self->partialKeyLen;
|
||||||
|
if (self->partialKeyCapacity <= maxCapacity) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
makeCapacityAtLeast(self, maxCapacity, allocators, impl);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO fuse into erase child so we don't need to repeat branches on type
|
// TODO fuse into erase child so we don't need to repeat branches on type
|
||||||
void maybeDownsize(Node *self, NodeAllocators *allocators,
|
void maybeDownsize(Node *self, NodeAllocators *allocators,
|
||||||
ConflictSet::Impl *impl) {
|
ConflictSet::Impl *impl, Node *&dontInvalidate) {
|
||||||
|
|
||||||
|
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||||
|
fprintf(stderr, "maybeDownsize: %s\n", getSearchPathPrintable(self).c_str());
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (self->type) {
|
switch (self->type) {
|
||||||
case Type::Node0:
|
case Type::Node0:
|
||||||
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||||
@@ -849,11 +867,11 @@ void maybeDownsize(Node *self, NodeAllocators *allocators,
|
|||||||
int minCapacity = self4->partialKeyLen + 1 + child->partialKeyLen;
|
int minCapacity = self4->partialKeyLen + 1 + child->partialKeyLen;
|
||||||
|
|
||||||
if (minCapacity > child->partialKeyCapacity) {
|
if (minCapacity > child->partialKeyCapacity) {
|
||||||
// TODO resize child? It seems to be quite challenging to implement,
|
const bool update = child == dontInvalidate;
|
||||||
// since callers would now have to account for erase invalidating
|
makeCapacityAtLeast(child, minCapacity, allocators, impl);
|
||||||
// not on the search path. We could lower kBytesPerKey by doing this
|
if (update) {
|
||||||
// though.
|
dontInvalidate = child;
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge partial key with child
|
// Merge partial key with child
|
||||||
@@ -885,7 +903,7 @@ void maybeDownsize(Node *self, NodeAllocators *allocators,
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Type::Node16:
|
case Type::Node16:
|
||||||
if (self->numChildren < kMinChildrenNode16) {
|
if (self->numChildren + int(self->entryPresent) < kMinChildrenNode16) {
|
||||||
auto *self16 = (Node16 *)self;
|
auto *self16 = (Node16 *)self;
|
||||||
auto *newSelf = allocators->node4.allocate(self->partialKeyLen);
|
auto *newSelf = allocators->node4.allocate(self->partialKeyLen);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
@@ -902,7 +920,7 @@ void maybeDownsize(Node *self, NodeAllocators *allocators,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Type::Node48:
|
case Type::Node48:
|
||||||
if (self->numChildren < kMinChildrenNode48) {
|
if (self->numChildren + int(self->entryPresent) < kMinChildrenNode48) {
|
||||||
auto *self48 = (Node48 *)self;
|
auto *self48 = (Node48 *)self;
|
||||||
auto *newSelf = allocators->node16.allocate(self->partialKeyLen);
|
auto *newSelf = allocators->node16.allocate(self->partialKeyLen);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
@@ -915,7 +933,7 @@ void maybeDownsize(Node *self, NodeAllocators *allocators,
|
|||||||
// Suppress a false positive -Waggressive-loop-optimizations warning
|
// Suppress a false positive -Waggressive-loop-optimizations warning
|
||||||
// in gcc. `assume` doesn't work for some reason.
|
// in gcc. `assume` doesn't work for some reason.
|
||||||
if (!(i < 16)) {
|
if (!(i < 16)) {
|
||||||
__builtin_unreachable();
|
__builtin_unreachable(); // GCOVR_EXCL_LINE
|
||||||
}
|
}
|
||||||
newSelf->index[i] = c;
|
newSelf->index[i] = c;
|
||||||
newSelf->children[i] = self48->children[self48->index[c]];
|
newSelf->children[i] = self48->children[self48->index[c]];
|
||||||
@@ -929,7 +947,7 @@ void maybeDownsize(Node *self, NodeAllocators *allocators,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Type::Node256:
|
case Type::Node256:
|
||||||
if (self->numChildren < kMinChildrenNode256) {
|
if (self->numChildren + int(self->entryPresent) < kMinChildrenNode256) {
|
||||||
auto *self256 = (Node256 *)self;
|
auto *self256 = (Node256 *)self;
|
||||||
auto *newSelf = allocators->node48.allocate(self->partialKeyLen);
|
auto *newSelf = allocators->node48.allocate(self->partialKeyLen);
|
||||||
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
memcpy((char *)newSelf + kNodeCopyBegin, (char *)self + kNodeCopyBegin,
|
||||||
@@ -954,16 +972,28 @@ void maybeDownsize(Node *self, NodeAllocators *allocators,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Precondition: self is not the root. May invalidate nodes along the search
|
// Precondition: self is not the root. May invalidate nodes along the search
|
||||||
// path to self.
|
// path to self. May invalidate children of self->parent. Returns a pointer to
|
||||||
Node *erase(Node *self, NodeAllocators *allocators, ConflictSet::Impl *impl) {
|
// the node after self. If erase invalidates the pointee of `dontInvalidate`, it
|
||||||
|
// will update it to its new pointee as well.
|
||||||
|
Node *erase(Node *self, NodeAllocators *allocators, ConflictSet::Impl *impl,
|
||||||
|
Node *&dontInvalidate) {
|
||||||
assert(self->parent != nullptr);
|
assert(self->parent != nullptr);
|
||||||
|
|
||||||
|
#if DEBUG_VERBOSE && !defined(NDEBUG)
|
||||||
|
fprintf(stderr, "Erase: %s\n", getSearchPathPrintable(self).c_str());
|
||||||
|
#endif
|
||||||
|
|
||||||
Node *parent = self->parent;
|
Node *parent = self->parent;
|
||||||
uint8_t parentsIndex = self->parentsIndex;
|
uint8_t parentsIndex = self->parentsIndex;
|
||||||
|
|
||||||
auto *result = nextLogical(self);
|
auto *result = nextLogical(self);
|
||||||
self->entryPresent = false;
|
self->entryPresent = false;
|
||||||
if (self->numChildren != 0) {
|
if (self->numChildren != 0) {
|
||||||
|
const bool update = result == dontInvalidate;
|
||||||
|
maybeDownsize(self, allocators, impl, result);
|
||||||
|
if (update) {
|
||||||
|
dontInvalidate = result;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1017,9 +1047,13 @@ Node *erase(Node *self, NodeAllocators *allocators, ConflictSet::Impl *impl) {
|
|||||||
--parent->numChildren;
|
--parent->numChildren;
|
||||||
if (parent->numChildren == 0 && !parent->entryPresent &&
|
if (parent->numChildren == 0 && !parent->entryPresent &&
|
||||||
parent->parent != nullptr) {
|
parent->parent != nullptr) {
|
||||||
erase(parent, allocators, impl);
|
return erase(parent, allocators, impl, dontInvalidate);
|
||||||
} else {
|
} else {
|
||||||
maybeDownsize(parent, allocators, impl);
|
const bool update = result == dontInvalidate;
|
||||||
|
maybeDownsize(parent, allocators, impl, result);
|
||||||
|
if (update) {
|
||||||
|
dontInvalidate = result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1223,10 +1257,6 @@ struct SearchStepWise {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace {
|
|
||||||
std::string getSearchPathPrintable(Node *n);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logically this is the same as performing firstGeq and then checking against
|
// Logically this is the same as performing firstGeq and then checking against
|
||||||
// point or range version according to cmp, but this version short circuits as
|
// point or range version according to cmp, but this version short circuits as
|
||||||
// soon as it can prove that there's no conflict.
|
// soon as it can prove that there's no conflict.
|
||||||
@@ -2015,7 +2045,7 @@ void addWriteRange(Node *&root, int64_t oldestVersion,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
for (beginNode = nextLogical(beginNode); beginNode != endNode;
|
||||||
beginNode = erase(beginNode, allocators, impl)) {
|
beginNode = erase(beginNode, allocators, impl, endNode)) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2141,7 +2171,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
// There's no way to insert a range such that range version of the right
|
// There's no way to insert a range such that range version of the right
|
||||||
// node is greater than the point version of the left node
|
// node is greater than the point version of the left node
|
||||||
assert(n->entry.rangeVersion <= oldestVersion);
|
assert(n->entry.rangeVersion <= oldestVersion);
|
||||||
n = erase(n, &allocators, this);
|
Node *dummy = nullptr;
|
||||||
|
n = erase(n, &allocators, this, dummy);
|
||||||
} else {
|
} else {
|
||||||
maybeDecreaseCapacity(n, &allocators, this);
|
maybeDecreaseCapacity(n, &allocators, this);
|
||||||
n = nextLogical(n);
|
n = nextLogical(n);
|
||||||
@@ -2493,11 +2524,12 @@ Iterator firstGeq(Node *n, std::string_view key) {
|
|||||||
minNumChildren = kMinChildrenNode256;
|
minNumChildren = kMinChildrenNode256;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (node->numChildren < minNumChildren) {
|
if (node->numChildren + int(node->entryPresent) < minNumChildren) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s has %d children, which is less than the minimum required %d\n",
|
"%s has %d children + %d entries, which is less than the minimum "
|
||||||
|
"required %d\n",
|
||||||
getSearchPathPrintable(node).c_str(), node->numChildren,
|
getSearchPathPrintable(node).c_str(), node->numChildren,
|
||||||
minNumChildren);
|
int(node->entryPresent), minNumChildren);
|
||||||
success = false;
|
success = false;
|
||||||
}
|
}
|
||||||
// TODO check that the max capacity property eventually holds
|
// TODO check that the max capacity property eventually holds
|
||||||
|
@@ -482,7 +482,7 @@ template <class ConflictSetImpl> struct TestDriver {
|
|||||||
ConflictSetImpl cs{oldestVersion};
|
ConflictSetImpl cs{oldestVersion};
|
||||||
ReferenceImpl refImpl{oldestVersion};
|
ReferenceImpl refImpl{oldestVersion};
|
||||||
|
|
||||||
constexpr static auto kMaxKeyLen = 64;
|
constexpr static auto kMaxKeyLen = 128;
|
||||||
|
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
|
|
||||||
|
BIN
corpus/00879ddec809af152140691ec44ba8132a8f01d2
Normal file
BIN
corpus/00879ddec809af152140691ec44ba8132a8f01d2
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/00cc0f455c0dcddaac01ca4135ed12f27f5cfed2
Normal file
BIN
corpus/00cc0f455c0dcddaac01ca4135ed12f27f5cfed2
Normal file
Binary file not shown.
BIN
corpus/00ed163ad8fb7c9b29a13c3ea1809e989cd82ef9
Normal file
BIN
corpus/00ed163ad8fb7c9b29a13c3ea1809e989cd82ef9
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/01c018a917db833f05d6c0e04e96198799953e16
Normal file
BIN
corpus/01c018a917db833f05d6c0e04e96198799953e16
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1
corpus/05a79f06cf3f67f726dae68d18a2290f6c9a50c9
Normal file
1
corpus/05a79f06cf3f67f726dae68d18a2290f6c9a50c9
Normal file
@@ -0,0 +1 @@
|
|||||||
|
:
|
BIN
corpus/06297bdca3ee519e0bc6b9992c2eb6e3e5559235
Normal file
BIN
corpus/06297bdca3ee519e0bc6b9992c2eb6e3e5559235
Normal file
Binary file not shown.
BIN
corpus/06934b123ae0610dd969388d5983d8689e80cfd7
Normal file
BIN
corpus/06934b123ae0610dd969388d5983d8689e80cfd7
Normal file
Binary file not shown.
BIN
corpus/06b10425f65b89ba3464846ea84b1f38f6332be8
Normal file
BIN
corpus/06b10425f65b89ba3464846ea84b1f38f6332be8
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/07e474fce6dd93493cbbce84168a8859b38e4d1e
Normal file
BIN
corpus/07e474fce6dd93493cbbce84168a8859b38e4d1e
Normal file
Binary file not shown.
BIN
corpus/07edb657dc7dc10cdc7384beaff41811e7c2eed8
Normal file
BIN
corpus/07edb657dc7dc10cdc7384beaff41811e7c2eed8
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/08da5c32b915e10ad0c7ca12e5da5fbe1492c57e
Normal file
BIN
corpus/08da5c32b915e10ad0c7ca12e5da5fbe1492c57e
Normal file
Binary file not shown.
BIN
corpus/08e52de82e520307b0304e1e98c4b4ebac7ceab0
Normal file
BIN
corpus/08e52de82e520307b0304e1e98c4b4ebac7ceab0
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/0959e4d73bfb824f1a5f90a6b7dcad46f7db2db7
Normal file
BIN
corpus/0959e4d73bfb824f1a5f90a6b7dcad46f7db2db7
Normal file
Binary file not shown.
BIN
corpus/098ebb4db647b726d18b4c808988b7caf976a95a
Normal file
BIN
corpus/098ebb4db647b726d18b4c808988b7caf976a95a
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/0bcfeb0963ee25dd38ccdc062a1cd45ecb3c1133
Normal file
BIN
corpus/0bcfeb0963ee25dd38ccdc062a1cd45ecb3c1133
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/0ce25b026c1c835de614a3d772e8d6b00f58c10c
Normal file
BIN
corpus/0ce25b026c1c835de614a3d772e8d6b00f58c10c
Normal file
Binary file not shown.
BIN
corpus/0e7a0b924f0f0dee763fecab2cf48aa580332206
Normal file
BIN
corpus/0e7a0b924f0f0dee763fecab2cf48aa580332206
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/0f59a6de38d7d431261ec4fd482e99b127f04b94
Normal file
BIN
corpus/0f59a6de38d7d431261ec4fd482e99b127f04b94
Normal file
Binary file not shown.
BIN
corpus/0f721b035da292dd8d040551b92faa33fbf51bdc
Normal file
BIN
corpus/0f721b035da292dd8d040551b92faa33fbf51bdc
Normal file
Binary file not shown.
BIN
corpus/0f83749baf11d0e43cd3b215d69e36ba1477c529
Normal file
BIN
corpus/0f83749baf11d0e43cd3b215d69e36ba1477c529
Normal file
Binary file not shown.
BIN
corpus/0fa17661f6d468a6065a91b3cd88413952ef6000
Normal file
BIN
corpus/0fa17661f6d468a6065a91b3cd88413952ef6000
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/10af5fa0b33a9ed0572fc54276bd49ce8a7ee419
Normal file
BIN
corpus/10af5fa0b33a9ed0572fc54276bd49ce8a7ee419
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/11ed56158b1484931de34d38454a9ad7cff07c24
Normal file
BIN
corpus/11ed56158b1484931de34d38454a9ad7cff07c24
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/129c09d57e97aeb7025eeff667e52582c233ce43
Normal file
BIN
corpus/129c09d57e97aeb7025eeff667e52582c233ce43
Normal file
Binary file not shown.
BIN
corpus/1450aa1eab8e8e151a8140a66f9e491f7d5b8981
Normal file
BIN
corpus/1450aa1eab8e8e151a8140a66f9e491f7d5b8981
Normal file
Binary file not shown.
BIN
corpus/14a2858e77e638d88cd774b1daa0bd04314d4793
Normal file
BIN
corpus/14a2858e77e638d88cd774b1daa0bd04314d4793
Normal file
Binary file not shown.
BIN
corpus/14c6bc097e56e41db1047271f96028a7fee06fa6
Normal file
BIN
corpus/14c6bc097e56e41db1047271f96028a7fee06fa6
Normal file
Binary file not shown.
BIN
corpus/1554486d861b6dca009e47989b85bce8639b47de
Normal file
BIN
corpus/1554486d861b6dca009e47989b85bce8639b47de
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/1656832b37b5fc76132d9d50de27e6137a2a6d2c
Normal file
BIN
corpus/1656832b37b5fc76132d9d50de27e6137a2a6d2c
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/168fdba36e62ed56f67b6fce0a30b42943a58be4
Normal file
BIN
corpus/168fdba36e62ed56f67b6fce0a30b42943a58be4
Normal file
Binary file not shown.
BIN
corpus/1841fe039040e49d98cb60458cfa98f279bec10a
Normal file
BIN
corpus/1841fe039040e49d98cb60458cfa98f279bec10a
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/19036b267deb185071c45a9df3202b352d916fc5
Normal file
BIN
corpus/19036b267deb185071c45a9df3202b352d916fc5
Normal file
Binary file not shown.
BIN
corpus/1922a62cd1a141321e85ea6db462719c46c13fde
Normal file
BIN
corpus/1922a62cd1a141321e85ea6db462719c46c13fde
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/1a6ec846db7894a1bf08ff44eeced3af164d3151
Normal file
BIN
corpus/1a6ec846db7894a1bf08ff44eeced3af164d3151
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/1b1c8e798d39b313bd793697de05fe74f7ed8a63
Normal file
BIN
corpus/1b1c8e798d39b313bd793697de05fe74f7ed8a63
Normal file
Binary file not shown.
BIN
corpus/1b242f22da8cf0f0507d43eff5a607dad9f7e77e
Normal file
BIN
corpus/1b242f22da8cf0f0507d43eff5a607dad9f7e77e
Normal file
Binary file not shown.
BIN
corpus/1c4b5f5582cb6551b730920695bc6874b8b81a71
Normal file
BIN
corpus/1c4b5f5582cb6551b730920695bc6874b8b81a71
Normal file
Binary file not shown.
BIN
corpus/1e2dd92778990c50a91ba6f7cae6c88769ab5727
Normal file
BIN
corpus/1e2dd92778990c50a91ba6f7cae6c88769ab5727
Normal file
Binary file not shown.
BIN
corpus/1e3e099f3799ef19348bdae7676f964d90520236
Normal file
BIN
corpus/1e3e099f3799ef19348bdae7676f964d90520236
Normal file
Binary file not shown.
BIN
corpus/1e5d39621191296f2729c8a04283cae6b0b0be3c
Normal file
BIN
corpus/1e5d39621191296f2729c8a04283cae6b0b0be3c
Normal file
Binary file not shown.
BIN
corpus/1f09170ac49fbee991f8858df70e8b22d077104f
Normal file
BIN
corpus/1f09170ac49fbee991f8858df70e8b22d077104f
Normal file
Binary file not shown.
BIN
corpus/1f97c165fe6df9d80d9ab9fd1ead89f170b992c3
Normal file
BIN
corpus/1f97c165fe6df9d80d9ab9fd1ead89f170b992c3
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/207ade93f35c3d6837d70c73ed7bc3fe21ac7fc0
Normal file
BIN
corpus/207ade93f35c3d6837d70c73ed7bc3fe21ac7fc0
Normal file
Binary file not shown.
BIN
corpus/20e5ca63cf73881379d80f5c96b046c059339783
Normal file
BIN
corpus/20e5ca63cf73881379d80f5c96b046c059339783
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/2150d7ce4125daed3fb969a44461e18b14028469
Normal file
BIN
corpus/2150d7ce4125daed3fb969a44461e18b14028469
Normal file
Binary file not shown.
BIN
corpus/222f70a67d63f8eba36050469f4b18e70ce78e67
Normal file
BIN
corpus/222f70a67d63f8eba36050469f4b18e70ce78e67
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/243046e357e5e5d7f1d8c059479bdbc2c60dfa6e
Normal file
BIN
corpus/243046e357e5e5d7f1d8c059479bdbc2c60dfa6e
Normal file
Binary file not shown.
BIN
corpus/260c003d16148505cee24757132b6087d1379584
Normal file
BIN
corpus/260c003d16148505cee24757132b6087d1379584
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/291103c2a4eddd7d731a5172dd1aa2a1253f2c6a
Normal file
BIN
corpus/291103c2a4eddd7d731a5172dd1aa2a1253f2c6a
Normal file
Binary file not shown.
BIN
corpus/2982cd4af166670dd8ccaf0f754dbffa3f03eec4
Normal file
BIN
corpus/2982cd4af166670dd8ccaf0f754dbffa3f03eec4
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
corpus/2b8d33d50b9192726d775da7fc1f008bd415958a
Normal file
BIN
corpus/2b8d33d50b9192726d775da7fc1f008bd415958a
Normal file
Binary file not shown.
BIN
corpus/2c65a2f10b5846ca1227ed012f9078fb9014b99d
Normal file
BIN
corpus/2c65a2f10b5846ca1227ed012f9078fb9014b99d
Normal file
Binary file not shown.
BIN
corpus/2c7b3544fa0c0c93d39e8e5424a87d7f8cf5371d
Normal file
BIN
corpus/2c7b3544fa0c0c93d39e8e5424a87d7f8cf5371d
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/2e930f1e397fd3a0a82f83ca26e1f914e67fb1eb
Normal file
BIN
corpus/2e930f1e397fd3a0a82f83ca26e1f914e67fb1eb
Normal file
Binary file not shown.
Binary file not shown.
BIN
corpus/2f1ee585f3aa6feeea85e276501eebae88d16b60
Normal file
BIN
corpus/2f1ee585f3aa6feeea85e276501eebae88d16b60
Normal file
Binary file not shown.
BIN
corpus/2f5848d152567d2ac08813608b7c0e6596c6cb49
Normal file
BIN
corpus/2f5848d152567d2ac08813608b7c0e6596c6cb49
Normal file
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user