char
__fastcall Watermark::Compile(_QWORD *
this
)
{
_QWORD *mask_;
__int64
size_value_;
unsigned
__int64
i;
unsigned
__int64
p;
unsigned
__int64
new_size;
unsigned
__int64
dump_condition;
char
*value_pointer;
_BYTE *dump_bytes;
_BYTE *mask_bytes;
unsigned
__int64
mask_new_size;
char
*mask_pointer;
_BYTE *mask_data;
_BYTE *dump_expansion;
char
mask_byte;
_QWORD *value_data;
char
c_value;
char
hex_value;
__int64
dump_offset;
char
current_byte;
char
v22[8];
mask_ =
this
+ 16;
this
[14] =
this
[13];
this
[17] =
this
[16];
size_value_ =
this
[9];
if
( size_value_ )
{
i = 0i64;
do
{
p = i >> 1;
if
( p >=
this
[14] -
this
[13] )
{
new_size =
this
[14];
v22[0] = 0;
if
( (unsigned
__int64
)v22 >= new_size || (dump_condition =
this
[13], dump_condition > (unsigned
__int64
)v22) )
{
if
( new_size ==
this
[15] )
ResizeDump(
this
+ 13, 1i64);
mask_bytes = (_BYTE *)
this
[14];
if
( mask_bytes )
*mask_bytes = 0;
}
else
{
value_pointer = &v22[-dump_condition];
if
( new_size ==
this
[15] )
ResizeDump(
this
+ 13, 1i64);
dump_bytes = (_BYTE *)
this
[14];
if
( dump_bytes )
*dump_bytes = value_pointer[
this
[13]];
}
++
this
[14];
mask_new_size = mask_[1];
v22[0] = 0;
if
( (unsigned
__int64
)v22 >= mask_new_size || *mask_ > (unsigned
__int64
)v22 )
{
if
( mask_new_size == mask_[2] )
ResizeMask(mask_, 1i64);
dump_expansion = (_BYTE *)mask_[1];
if
( dump_expansion )
*dump_expansion = 0;
}
else
{
mask_pointer = &v22[-*mask_];
if
( mask_new_size == mask_[2] )
ResizeMask(mask_, 1i64);
mask_data = (_BYTE *)mask_[1];
if
( mask_data )
*mask_data = mask_pointer[*mask_];
}
++mask_[1];
}
mask_byte = -1;
if
(
this
[10] < 0x10ui64 )
value_data =
this
+ 7;
else
value_data = (_QWORD *)
this
[7];
c_value = *((_BYTE *)value_data + i);
if
( (unsigned
__int8
)(c_value - 48) > 9u )
{
if
( (unsigned
__int8
)(c_value - 65) > 5u )
{
if
( (unsigned
__int8
)(c_value - 97) > 5u )
{
mask_byte = 0;
hex_value = RandomFunction();
}
else
{
hex_value = c_value - 87;
}
}
else
{
hex_value = c_value - 55;
}
}
else
{
hex_value = c_value - 48;
}
dump_offset =
this
[13];
current_byte = *(_BYTE *)(dump_offset + p);
if
( (i & 1) != 0 )
{
*(_BYTE *)(dump_offset + p) ^= (hex_value ^ current_byte) & 0xF;
LOBYTE(size_value_) = (mask_byte ^ *(_BYTE *)(*mask_ + p)) & 0xF;
*(_BYTE *)(*mask_ + p) ^= size_value_;
}
else
{
*(_BYTE *)(dump_offset + p) = (16 * hex_value) | current_byte & 0xF;
LOBYTE(size_value_) = (16 * mask_byte) | *(_BYTE *)(*mask_ + p) & 0xF;
*(_BYTE *)(*mask_ + p) = size_value_;
}
++i;
}
while
( i <
this
[9] );
}
return
size_value_;
}