mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
* WIP on event condition format
* Hero portrait serialization * Fix town spells serialization * Added support for float exponential part in Json * Added support for int64 in Json * Added basic Hero definitions serialization * Added rumors serialization * Advanced player info serialization. * Added Disposed heroes serialization, (!) not covered with tests yet * Added Local event serialization * Added Pandoras box serialization * Added Seer hut reward serialization * Added CQuest serialization * Added API for map object instance names serialization. * Added random dwelling options serialization * Advanced town options serialization * Advanced hero options serialization * More map format tests * A lot of fixes, cleanup and refactoring
This commit is contained in:
parent
5127061e28
commit
a85b4cf2a5
@ -327,6 +327,12 @@ TSubgoal Win::whatToDoToAchieve()
|
|||||||
break; // Should be only used in calculation of candidates (see toBool lambda)
|
break; // Should be only used in calculation of candidates (see toBool lambda)
|
||||||
case EventCondition::CONST_VALUE:
|
case EventCondition::CONST_VALUE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EventCondition::HAVE_0:
|
||||||
|
case EventCondition::HAVE_BUILDING_0:
|
||||||
|
case EventCondition::DESTROY_0:
|
||||||
|
//TODO: support new condition format
|
||||||
|
return sptr (Goals::Conquer());
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
@ -2512,9 +2512,9 @@ void OptionsTab::recreate()
|
|||||||
entries.insert(std::make_pair(it->first, new PlayerOptionsEntry(this, it->second)));
|
entries.insert(std::make_pair(it->first, new PlayerOptionsEntry(this, it->second)));
|
||||||
const std::vector<SHeroName> &heroes = SEL->current->mapHeader->players[it->first.getNum()].heroesNames;
|
const std::vector<SHeroName> &heroes = SEL->current->mapHeader->players[it->first.getNum()].heroesNames;
|
||||||
for(auto & heroe : heroes)
|
for(auto & heroe : heroes)
|
||||||
usedHeroes.insert(heroe.heroId);
|
if(heroe.heroId >= 0)//in VCMI map format heroId = -1 means random hero
|
||||||
|
usedHeroes.insert(heroe.heroId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionsTab::setTurnLength( int npos )
|
void OptionsTab::setTurnLength( int npos )
|
||||||
|
69
config/factions/random.json
Normal file
69
config/factions/random.json
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"random":
|
||||||
|
{
|
||||||
|
"index": -1,
|
||||||
|
"town":
|
||||||
|
{
|
||||||
|
"mapObject" :
|
||||||
|
{
|
||||||
|
"templates" :
|
||||||
|
{
|
||||||
|
"castle" : { "editorAnimation" : "AVCRANX0.def" },
|
||||||
|
"village" : { "editorAnimation" : "AVCRAND0.def" },
|
||||||
|
"capitol" : { "editorAnimation" : "AVCRANZ0.def" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buildings" :
|
||||||
|
{
|
||||||
|
"mageGuild1": { "id" : 0 },
|
||||||
|
"mageGuild2": { "id" : 1, "upgrades" : "mageGuild1" },
|
||||||
|
"mageGuild3": { "id" : 2, "upgrades" : "mageGuild2" },
|
||||||
|
"mageGuild4": { "id" : 3, "upgrades" : "mageGuild3" },
|
||||||
|
"mageGuild5": { "id" : 4, "upgrades" : "mageGuild4" },
|
||||||
|
|
||||||
|
"tavern": { "id" : 5 },
|
||||||
|
"shipyard": { "id" : 6 },
|
||||||
|
"fort": { "id" : 7 },
|
||||||
|
"citadel": { "id" : 8, "upgrades" : "fort" },
|
||||||
|
"castle": { "id" : 9, "upgrades" : "citadel" },
|
||||||
|
|
||||||
|
|
||||||
|
"villageHall": { "id" : 10, "mode" : "auto", "produce" : { "gold": 500 } },
|
||||||
|
"townHall": { "id" : 11, "upgrades" : "villageHall", "requires" : [ "tavern" ], "produce" : { "gold": 1000 } },
|
||||||
|
"cityHall": { "id" : 12, "upgrades" : "townHall", "requires" : [ "allOf", [ "mageGuild1" ], [ "marketplace" ], [ "blacksmith" ] ], "produce": { "gold": 2000 } },
|
||||||
|
"capitol": { "id" : 13, "upgrades" : "cityHall", "requires" : [ "castle" ], "produce" : { "gold": 4000 } },
|
||||||
|
|
||||||
|
|
||||||
|
"marketplace": { "id" : 14 },
|
||||||
|
"resourceSilo": { "id" : 15, "upgrades" : "marketplace" },
|
||||||
|
"blacksmith": { "id" : 16 },
|
||||||
|
|
||||||
|
"horde1": { "id" : -30, "upgrades" : "dwellingLvl1" },
|
||||||
|
"horde2": { "id" : -31, "upgrades" : "dwellingLvl2" },
|
||||||
|
"horde3": { "id" : -32, "upgrades" : "dwellingLvl3" },
|
||||||
|
"horde4": { "id" : -33, "upgrades" : "dwellingLvl4" },
|
||||||
|
"horde5": { "id" : -34, "upgrades" : "dwellingLvl5" },
|
||||||
|
"horde6": { "id" : -35, "upgrades" : "dwellingLvl6" },
|
||||||
|
"horde7": { "id" : -36, "upgrades" : "dwellingLvl7" },
|
||||||
|
|
||||||
|
"grail": { "id" : 26, "mode" : "grail", "produce" : { "gold": 5000 } },
|
||||||
|
|
||||||
|
"dwellingLvl1": { "id" : 30 },
|
||||||
|
"dwellingLvl2": { "id" : 31 },
|
||||||
|
"dwellingLvl3": { "id" : 32 },
|
||||||
|
"dwellingLvl4": { "id" : 33 },
|
||||||
|
"dwellingLvl5": { "id" : 34 },
|
||||||
|
"dwellingLvl6": { "id" : 35 },
|
||||||
|
"dwellingLvl7": { "id" : 36 },
|
||||||
|
|
||||||
|
"dwellingUpLvl1": { "id" : 37, "upgrades" : "dwellingLvl1" },
|
||||||
|
"dwellingUpLvl2": { "id" : 38, "upgrades" : "dwellingLvl2" },
|
||||||
|
"dwellingUpLvl3": { "id" : 39, "upgrades" : "dwellingLvl3" },
|
||||||
|
"dwellingUpLvl4": { "id" : 40, "upgrades" : "dwellingLvl4" },
|
||||||
|
"dwellingUpLvl5": { "id" : 41, "upgrades" : "dwellingLvl5" },
|
||||||
|
"dwellingUpLvl6": { "id" : 42, "upgrades" : "dwellingLvl6" },
|
||||||
|
"dwellingUpLvl7": { "id" : 43, "upgrades" : "dwellingLvl7" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "mapObjects/CObjectClassesHandler.h"
|
#include "mapObjects/CObjectClassesHandler.h"
|
||||||
#include "mapping/CMap.h"
|
#include "mapping/CMap.h"
|
||||||
|
#include "serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
// Note: list must match entries in ArtTraits.txt
|
// Note: list must match entries in ArtTraits.txt
|
||||||
#define ART_POS_LIST \
|
#define ART_POS_LIST \
|
||||||
@ -1220,6 +1221,8 @@ bool CCombinedArtifactInstance::ConstituentInfo::operator==(const ConstituentInf
|
|||||||
return art == rhs.art && slot == rhs.slot;
|
return art == rhs.art && slot == rhs.slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CArtifactSet::~CArtifactSet() = default;
|
||||||
|
|
||||||
const CArtifactInstance* CArtifactSet::getArt(ArtifactPosition pos, bool excludeLocked /*= true*/) const
|
const CArtifactInstance* CArtifactSet::getArt(ArtifactPosition pos, bool excludeLocked /*= true*/) const
|
||||||
{
|
{
|
||||||
if(const ArtSlotInfo *si = getSlot(pos))
|
if(const ArtSlotInfo *si = getSlot(pos))
|
||||||
@ -1377,12 +1380,106 @@ void CArtifactSet::artDeserializationFix(CBonusSystemNode *node)
|
|||||||
node->attachTo(elem.second.artifact);
|
node->attachTo(elem.second.artifact);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactSet::writeJson(JsonNode& json) const
|
void CArtifactSet::serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName, CMap * map)
|
||||||
{
|
{
|
||||||
|
//todo: creature and commander artifacts
|
||||||
|
if(handler.saving && artifactsInBackpack.empty() && artifactsWorn.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
assert(map);
|
||||||
|
artifactsInBackpack.clear();
|
||||||
|
artifactsWorn.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto s = handler.enterStruct(fieldName);
|
||||||
|
|
||||||
|
switch(bearerType())
|
||||||
|
{
|
||||||
|
case ArtBearer::HERO:
|
||||||
|
serializeJsonHero(handler, map);
|
||||||
|
break;
|
||||||
|
case ArtBearer::CREATURE:
|
||||||
|
serializeJsonCreature(handler, map);
|
||||||
|
break;
|
||||||
|
case ArtBearer::COMMANDER:
|
||||||
|
serializeJsonCommander(handler, map);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CArtifactSet::readJson(const JsonNode& json)
|
void CArtifactSet::serializeJsonHero(JsonSerializeFormat & handler, CMap * map)
|
||||||
{
|
{
|
||||||
|
for(ArtifactPosition ap = ArtifactPosition::HEAD; ap < ArtifactPosition::AFTER_LAST; ap.advance(1))
|
||||||
|
{
|
||||||
|
serializeJsonSlot(handler, ap, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<ArtifactID> backpackTemp;
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
backpackTemp.reserve(artifactsInBackpack.size());
|
||||||
|
for(const ArtSlotInfo & info : artifactsInBackpack)
|
||||||
|
backpackTemp.push_back(info.artifact->artType->id);
|
||||||
|
}
|
||||||
|
handler.serializeIdArray(NArtifactPosition::backpack, backpackTemp, &CArtHandler::decodeArfifact, &CArtHandler::encodeArtifact);
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
for(const ArtifactID & artifactID : backpackTemp)
|
||||||
|
{
|
||||||
|
auto artifact = CArtifactInstance::createArtifact(map, artifactID.toEnum());
|
||||||
|
auto slot = ArtifactPosition(GameConstants::BACKPACK_START + artifactsInBackpack.size());
|
||||||
|
if(artifact->canBePutAt(this, slot))
|
||||||
|
putArtifact(slot, artifact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactSet::serializeJsonCreature(JsonSerializeFormat & handler, CMap * map)
|
||||||
|
{
|
||||||
|
logGlobal->error("CArtifactSet::serializeJsonCreature not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactSet::serializeJsonCommander(JsonSerializeFormat & handler, CMap * map)
|
||||||
|
{
|
||||||
|
logGlobal->error("CArtifactSet::serializeJsonCommander not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CArtifactSet::serializeJsonSlot(JsonSerializeFormat & handler, const ArtifactPosition & slot, CMap * map)
|
||||||
|
{
|
||||||
|
ArtifactID artifactID;
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
const ArtSlotInfo * info = getSlot(slot);
|
||||||
|
|
||||||
|
if(info != nullptr && !info->locked)
|
||||||
|
{
|
||||||
|
artifactID = info->artifact->artType->id;
|
||||||
|
handler.serializeId(NArtifactPosition::namesHero[slot.num], artifactID, ArtifactID::NONE, &CArtHandler::decodeArfifact, &CArtHandler::encodeArtifact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handler.serializeId(NArtifactPosition::namesHero[slot.num], artifactID, ArtifactID::NONE, &CArtHandler::decodeArfifact, &CArtHandler::encodeArtifact);
|
||||||
|
|
||||||
|
if(artifactID != ArtifactID::NONE)
|
||||||
|
{
|
||||||
|
auto artifact = CArtifactInstance::createArtifact(map, artifactID.toEnum());
|
||||||
|
|
||||||
|
if(artifact->canBePutAt(this, slot))
|
||||||
|
{
|
||||||
|
putArtifact(slot, artifact);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logGlobal->debugStream() << "Artifact can't be put at the specified location."; //TODO add more debugging information
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ class CArtifactSet;
|
|||||||
class CArtifactInstance;
|
class CArtifactInstance;
|
||||||
class CRandomGenerator;
|
class CRandomGenerator;
|
||||||
class CMap;
|
class CMap;
|
||||||
|
class JsonSerializeFormat;
|
||||||
|
|
||||||
#define ART_BEARER_LIST \
|
#define ART_BEARER_LIST \
|
||||||
ART_BEARER(HERO)\
|
ART_BEARER(HERO)\
|
||||||
@ -322,7 +323,8 @@ public:
|
|||||||
bool isPositionFree(ArtifactPosition pos, bool onlyLockCheck = false) const;
|
bool isPositionFree(ArtifactPosition pos, bool onlyLockCheck = false) const;
|
||||||
|
|
||||||
virtual ArtBearer::ArtBearer bearerType() const = 0;
|
virtual ArtBearer::ArtBearer bearerType() const = 0;
|
||||||
virtual ~CArtifactSet() = default;
|
virtual void putArtifact(ArtifactPosition pos, CArtifactInstance * art) = 0;
|
||||||
|
virtual ~CArtifactSet();
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
@ -331,10 +333,15 @@ public:
|
|||||||
|
|
||||||
void artDeserializationFix(CBonusSystemNode *node);
|
void artDeserializationFix(CBonusSystemNode *node);
|
||||||
|
|
||||||
|
void serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName, CMap * map);
|
||||||
protected:
|
protected:
|
||||||
void writeJson(JsonNode & json) const;
|
|
||||||
void readJson(const JsonNode & json);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::pair<const CCombinedArtifactInstance *, const CArtifactInstance *> searchForConstituent(int aid) const;
|
std::pair<const CCombinedArtifactInstance *, const CArtifactInstance *> searchForConstituent(int aid) const;
|
||||||
|
private:
|
||||||
|
void serializeJsonHero(JsonSerializeFormat & handler, CMap * map);
|
||||||
|
void serializeJsonCreature(JsonSerializeFormat & handler, CMap * map);
|
||||||
|
void serializeJsonCommander(JsonSerializeFormat & handler, CMap * map);
|
||||||
|
|
||||||
|
void serializeJsonSlot(JsonSerializeFormat & handler, const ArtifactPosition & slot, CMap * map);//normal slots
|
||||||
};
|
};
|
||||||
|
@ -460,6 +460,20 @@ std::vector<bool> CCreatureHandler::getDefaultAllowed() const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
si32 CCreatureHandler::decodeCreature(const std::string& identifier)
|
||||||
|
{
|
||||||
|
auto rawId = VLC->modh->identifiers.getIdentifier("core", "creature", identifier);
|
||||||
|
if(rawId)
|
||||||
|
return rawId.get();
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CCreatureHandler::encodeCreature(const si32 index)
|
||||||
|
{
|
||||||
|
return VLC->creh->creatures[index]->identifier;
|
||||||
|
}
|
||||||
|
|
||||||
void CCreatureHandler::loadCrExpBon()
|
void CCreatureHandler::loadCrExpBon()
|
||||||
{
|
{
|
||||||
if (VLC->modh->modules.STACK_EXP) //reading default stack experience bonuses
|
if (VLC->modh->modules.STACK_EXP) //reading default stack experience bonuses
|
||||||
|
@ -216,6 +216,12 @@ public:
|
|||||||
|
|
||||||
std::vector<bool> getDefaultAllowed() const override;
|
std::vector<bool> getDefaultAllowed() const override;
|
||||||
|
|
||||||
|
///json serialization helper
|
||||||
|
static si32 decodeCreature(const std::string & identifier);
|
||||||
|
|
||||||
|
///json serialization helper
|
||||||
|
static std::string encodeCreature(const si32 index);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)
|
//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "CHeroHandler.h"
|
#include "CHeroHandler.h"
|
||||||
#include "IBonusTypeHandler.h"
|
#include "IBonusTypeHandler.h"
|
||||||
#include "serializer/JsonSerializeFormat.h"
|
#include "serializer/JsonSerializeFormat.h"
|
||||||
|
#include "NetPacksBase.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CCreatureSet.cpp, part of VCMI engine
|
* CCreatureSet.cpp, part of VCMI engine
|
||||||
@ -483,31 +484,46 @@ void CCreatureSet::armyChanged()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCreatureSet::serializeJson(JsonSerializeFormat & handler, const std::string & fieldName)
|
void CCreatureSet::serializeJson(JsonSerializeFormat & handler, const std::string & fieldName, const boost::optional<int> fixedSize)
|
||||||
{
|
{
|
||||||
if(handler.saving && stacks.empty())
|
if(handler.saving && stacks.empty())
|
||||||
return;
|
return;
|
||||||
JsonNode & json = handler.getCurrent()[fieldName];
|
|
||||||
|
auto a = handler.enterArray(fieldName);
|
||||||
|
|
||||||
|
|
||||||
if(handler.saving)
|
if(handler.saving)
|
||||||
{
|
{
|
||||||
|
size_t sz = 0;
|
||||||
|
|
||||||
|
for(const auto & p : stacks)
|
||||||
|
vstd::amax(sz, p.first.getNum()+1);
|
||||||
|
|
||||||
|
if(fixedSize)
|
||||||
|
vstd::amax(sz, fixedSize.get());
|
||||||
|
|
||||||
|
a.resize(sz, JsonNode::DATA_STRUCT);
|
||||||
|
|
||||||
for(const auto & p : stacks)
|
for(const auto & p : stacks)
|
||||||
{
|
{
|
||||||
JsonNode stack_node;
|
auto s = a.enterStruct(p.first.getNum());
|
||||||
p.second->writeJson(stack_node);
|
p.second->serializeJson(handler);
|
||||||
json.Vector()[p.first.getNum()] = stack_node;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(size_t idx = 0; idx < json.Vector().size(); idx++)
|
for(size_t idx = 0; idx < a.size(); idx++)
|
||||||
{
|
{
|
||||||
if(json.Vector()[idx]["amount"].Float() > 0)
|
auto s = a.enterStruct(idx);
|
||||||
|
|
||||||
|
TQuantity amount = 0;
|
||||||
|
|
||||||
|
handler.serializeInt("amount", amount);
|
||||||
|
|
||||||
|
if(amount > 0)
|
||||||
{
|
{
|
||||||
CStackInstance * new_stack = new CStackInstance();
|
CStackInstance * new_stack = new CStackInstance();
|
||||||
|
new_stack->serializeJson(handler);
|
||||||
new_stack->readJson(json.Vector()[idx]);
|
|
||||||
|
|
||||||
putStack(SlotID(idx), new_stack);
|
putStack(SlotID(idx), new_stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -624,7 +640,8 @@ void CStackInstance::setType(const CCreature *c)
|
|||||||
experience *= VLC->creh->expAfterUpgrade / 100.0;
|
experience *= VLC->creh->expAfterUpgrade / 100.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
type = c;
|
CStackBasicDescriptor::setType(c);
|
||||||
|
|
||||||
if(type)
|
if(type)
|
||||||
attachTo(const_cast<CCreature*>(type));
|
attachTo(const_cast<CCreature*>(type));
|
||||||
}
|
}
|
||||||
@ -733,23 +750,43 @@ ArtBearer::ArtBearer CStackInstance::bearerType() const
|
|||||||
return ArtBearer::CREATURE;
|
return ArtBearer::CREATURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CStackInstance::writeJson(JsonNode& json) const
|
void CStackInstance::putArtifact(ArtifactPosition pos, CArtifactInstance * art)
|
||||||
{
|
{
|
||||||
if(idRand > -1)
|
assert(!getArt(pos));
|
||||||
{
|
art->putAt(ArtifactLocation(this, pos));
|
||||||
json["level"].Float() = (int)idRand / 2;
|
|
||||||
json["upgraded"].Bool() = (idRand % 2) > 0;
|
|
||||||
}
|
|
||||||
CStackBasicDescriptor::writeJson(json);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CStackInstance::readJson(const JsonNode& json)
|
void CStackInstance::serializeJson(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
if(json["type"].String() == "")
|
//todo: artifacts
|
||||||
|
CStackBasicDescriptor::serializeJson(handler);//must be first
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
{
|
{
|
||||||
idRand = json["level"].Float() * 2 + (int)json["upgraded"].Bool();
|
if(idRand > -1)
|
||||||
|
{
|
||||||
|
int level = (int)idRand / 2;
|
||||||
|
|
||||||
|
boost::logic::tribool upgraded = (idRand % 2) > 0;
|
||||||
|
|
||||||
|
handler.serializeInt("level", level, 0);
|
||||||
|
handler.serializeBool("upgraded", upgraded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//type set by CStackBasicDescriptor::serializeJson
|
||||||
|
if(type == nullptr)
|
||||||
|
{
|
||||||
|
int level = 0;
|
||||||
|
bool upgraded = false;
|
||||||
|
|
||||||
|
handler.serializeInt("level", level, 0);
|
||||||
|
handler.serializeBool("upgraded", upgraded);
|
||||||
|
|
||||||
|
idRand = level * 2 + (int)(bool)upgraded;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CStackBasicDescriptor::readJson(json);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CCommanderInstance::CCommanderInstance()
|
CCommanderInstance::CCommanderInstance()
|
||||||
@ -844,20 +881,30 @@ CStackBasicDescriptor::CStackBasicDescriptor(const CCreature *c, TQuantity Count
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CStackBasicDescriptor::writeJson(JsonNode& json) const
|
void CStackBasicDescriptor::setType(const CCreature * c)
|
||||||
{
|
{
|
||||||
json.setType(JsonNode::DATA_STRUCT);
|
type = c;
|
||||||
if(type)
|
|
||||||
json["type"].String() = type->identifier;
|
|
||||||
json["amount"].Float() = count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CStackBasicDescriptor::readJson(const JsonNode& json)
|
void CStackBasicDescriptor::serializeJson(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
auto typeName = json["type"].String();
|
handler.serializeInt("amount", count);
|
||||||
if(typeName != "")
|
|
||||||
type = VLC->creh->getCreature("core", json["type"].String());
|
if(handler.saving)
|
||||||
count = json["amount"].Float();
|
{
|
||||||
|
if(type)
|
||||||
|
{
|
||||||
|
std::string typeName = type->identifier;
|
||||||
|
handler.serializeString("type", typeName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string typeName("");
|
||||||
|
handler.serializeString("type", typeName);
|
||||||
|
if(typeName != "")
|
||||||
|
setType(VLC->creh->getCreature("core", typeName));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DLL_LINKAGE std::ostream & operator<<(std::ostream & str, const CStackInstance & sth)
|
DLL_LINKAGE std::ostream & operator<<(std::ostream & str, const CStackInstance & sth)
|
||||||
|
@ -32,14 +32,14 @@ public:
|
|||||||
CStackBasicDescriptor(const CCreature *c, TQuantity Count);
|
CStackBasicDescriptor(const CCreature *c, TQuantity Count);
|
||||||
virtual ~CStackBasicDescriptor() = default;
|
virtual ~CStackBasicDescriptor() = default;
|
||||||
|
|
||||||
|
virtual void setType(const CCreature * c);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & type & count;
|
h & type & count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeJson(JsonNode & json) const;
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
void readJson(const JsonNode & json);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CStackInstance : public CBonusSystemNode, public CStackBasicDescriptor, public CArtifactSet
|
class DLL_LINKAGE CStackInstance : public CBonusSystemNode, public CStackBasicDescriptor, public CArtifactSet
|
||||||
@ -65,9 +65,7 @@ public:
|
|||||||
BONUS_TREE_DESERIALIZATION_FIX
|
BONUS_TREE_DESERIALIZATION_FIX
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeJson(JsonNode & json) const;
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
void readJson(const JsonNode & json);
|
|
||||||
|
|
||||||
//overrides CBonusSystemNode
|
//overrides CBonusSystemNode
|
||||||
std::string bonusToString(const std::shared_ptr<Bonus>& bonus, bool description) const override; // how would bonus description look for this particular type of node
|
std::string bonusToString(const std::shared_ptr<Bonus>& bonus, bool description) const override; // how would bonus description look for this particular type of node
|
||||||
@ -88,10 +86,11 @@ public:
|
|||||||
virtual ~CStackInstance();
|
virtual ~CStackInstance();
|
||||||
|
|
||||||
void setType(CreatureID creID);
|
void setType(CreatureID creID);
|
||||||
void setType(const CCreature *c);
|
void setType(const CCreature * c) override;
|
||||||
void setArmyObj(const CArmedInstance *ArmyObj);
|
void setArmyObj(const CArmedInstance *ArmyObj);
|
||||||
virtual void giveStackExp(TExpType exp);
|
virtual void giveStackExp(TExpType exp);
|
||||||
bool valid(bool allowUnrandomized) const;
|
bool valid(bool allowUnrandomized) const;
|
||||||
|
void putArtifact(ArtifactPosition pos, CArtifactInstance * art) override;//from CArtifactSet
|
||||||
ArtBearer::ArtBearer bearerType() const override; //from CArtifactSet
|
ArtBearer::ArtBearer bearerType() const override; //from CArtifactSet
|
||||||
virtual std::string nodeName() const override; //from CBonusSystemnode
|
virtual std::string nodeName() const override; //from CBonusSystemnode
|
||||||
void deserializationFix();
|
void deserializationFix();
|
||||||
@ -222,7 +221,7 @@ public:
|
|||||||
h & stacks & formation;
|
h & stacks & formation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName);
|
void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName, const boost::optional<int> fixedSize = boost::none);
|
||||||
|
|
||||||
operator bool() const
|
operator bool() const
|
||||||
{
|
{
|
||||||
|
@ -99,8 +99,16 @@ const CTown * CGameInfoCallback::getNativeTown(PlayerColor color) const
|
|||||||
|
|
||||||
const CGObjectInstance * CGameInfoCallback::getObjByQuestIdentifier(int identifier) const
|
const CGObjectInstance * CGameInfoCallback::getObjByQuestIdentifier(int identifier) const
|
||||||
{
|
{
|
||||||
ERROR_RET_VAL_IF(!vstd::contains(gs->map->questIdentifierToId, identifier), "There is no object with such quest identifier!", nullptr);
|
if(gs->map->questIdentifierToId.empty())
|
||||||
return getObj(gs->map->questIdentifierToId[identifier]);
|
{
|
||||||
|
//assume that it is VCMI map and quest identifier equals instance identifier
|
||||||
|
return getObj(ObjectInstanceID(identifier), true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERROR_RET_VAL_IF(!vstd::contains(gs->map->questIdentifierToId, identifier), "There is no object with such quest identifier!", nullptr);
|
||||||
|
return getObj(gs->map->questIdentifierToId[identifier]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
@ -510,8 +510,29 @@ std::pair<Obj,int> CGameState::pickObject (CGObjectInstance *obj)
|
|||||||
if (auto info = dynamic_cast<CCreGenAsCastleInfo*>(dwl->info))
|
if (auto info = dynamic_cast<CCreGenAsCastleInfo*>(dwl->info))
|
||||||
{
|
{
|
||||||
faction = getRandomGenerator().nextInt(VLC->townh->factions.size() - 1);
|
faction = getRandomGenerator().nextInt(VLC->townh->factions.size() - 1);
|
||||||
if (info->asCastle)
|
if(info->asCastle && info->instanceId != "")
|
||||||
{
|
{
|
||||||
|
auto iter = map->instanceNames.find(info->instanceId);
|
||||||
|
|
||||||
|
if(iter == map->instanceNames.end())
|
||||||
|
logGlobal->errorStream() << "Map object not found: " << info->instanceId;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto elem = iter->second;
|
||||||
|
if(elem->ID==Obj::RANDOM_TOWN)
|
||||||
|
{
|
||||||
|
randomizeObject(elem.get()); //we have to randomize the castle first
|
||||||
|
faction = elem->subID;
|
||||||
|
}
|
||||||
|
else if(elem->ID==Obj::TOWN)
|
||||||
|
faction = elem->subID;
|
||||||
|
else
|
||||||
|
logGlobal->errorStream() << "Map object must be town: " << info->instanceId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(info->asCastle)
|
||||||
|
{
|
||||||
|
|
||||||
for(auto & elem : map->objects)
|
for(auto & elem : map->objects)
|
||||||
{
|
{
|
||||||
if(!elem)
|
if(!elem)
|
||||||
@ -534,12 +555,16 @@ std::pair<Obj,int> CGameState::pickObject (CGObjectInstance *obj)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while(!(info->castles[0]&(1<<faction)))
|
std::set<int> temp;
|
||||||
{
|
|
||||||
if((faction>7) && (info->castles[1]&(1<<(faction-8))))
|
for(int i = 0; i < info->allowedFactions.size(); i++)
|
||||||
break;
|
if(info->allowedFactions[i])
|
||||||
faction = getRandomGenerator().nextInt(GameConstants::F_NUMBER - 1);
|
temp.insert(i);
|
||||||
}
|
|
||||||
|
if(temp.empty())
|
||||||
|
logGlobal->error("Random faction selection failed. Nothing is allowed. Fall back to random.");
|
||||||
|
else
|
||||||
|
faction = *RandomGeneratorUtil::nextItem(temp, getRandomGenerator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // castle alignment fixed
|
else // castle alignment fixed
|
||||||
@ -1119,7 +1144,7 @@ void CGameState::placeCampaignHeroes()
|
|||||||
|
|
||||||
hero->subID = heroTypeId;
|
hero->subID = heroTypeId;
|
||||||
hero->portrait = hero->subID;
|
hero->portrait = hero->subID;
|
||||||
map->getEditManager()->insertObject(hero, hero->pos);
|
map->getEditManager()->insertObject(hero);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1127,10 +1152,11 @@ void CGameState::placeCampaignHeroes()
|
|||||||
|
|
||||||
void CGameState::placeStartingHero(PlayerColor playerColor, HeroTypeID heroTypeId, int3 townPos)
|
void CGameState::placeStartingHero(PlayerColor playerColor, HeroTypeID heroTypeId, int3 townPos)
|
||||||
{
|
{
|
||||||
townPos.x += 1;
|
townPos.x -= 2; //FIXME: use actual visitable offset of town
|
||||||
|
|
||||||
CGHeroInstance * hero = static_cast<CGHeroInstance*>(createObject(Obj::HERO, heroTypeId.getNum(), townPos, playerColor));
|
CGObjectInstance * hero = createObject(Obj::HERO, heroTypeId.getNum(), townPos, playerColor);
|
||||||
map->getEditManager()->insertObject(hero, townPos);
|
hero->pos += hero->getVisitableOffset();
|
||||||
|
map->getEditManager()->insertObject(hero);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenarios() const
|
CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenarios() const
|
||||||
@ -1651,7 +1677,7 @@ void CGameState::initTowns()
|
|||||||
PlayerInfo & pi = map->players[owner->color.getNum()];
|
PlayerInfo & pi = map->players[owner->color.getNum()];
|
||||||
|
|
||||||
if (owner->human && //human-owned
|
if (owner->human && //human-owned
|
||||||
map->towns[g]->pos == pi.posOfMainTown + int3(2, 0, 0))
|
map->towns[g]->pos == pi.posOfMainTown)
|
||||||
{
|
{
|
||||||
map->towns[g]->builtBuildings.insert(
|
map->towns[g]->builtBuildings.insert(
|
||||||
CBuildingHandler::campToERMU(chosenBonus->info1, map->towns[g]->subID, map->towns[g]->builtBuildings));
|
CBuildingHandler::campToERMU(chosenBonus->info1, map->towns[g]->subID, map->towns[g]->builtBuildings));
|
||||||
@ -2351,9 +2377,28 @@ bool CGameState::checkForVictory(PlayerColor player, const EventCondition & cond
|
|||||||
{
|
{
|
||||||
return condition.value; // just convert to bool
|
return condition.value; // just convert to bool
|
||||||
}
|
}
|
||||||
|
case EventCondition::HAVE_0:
|
||||||
|
{
|
||||||
|
logGlobal->debug("Not implemented event condition type: %d", (int)condition.condition);
|
||||||
|
//TODO: support new condition format
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case EventCondition::HAVE_BUILDING_0:
|
||||||
|
{
|
||||||
|
logGlobal->debug("Not implemented event condition type: %d", (int)condition.condition);
|
||||||
|
//TODO: support new condition format
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case EventCondition::DESTROY_0:
|
||||||
|
{
|
||||||
|
logGlobal->debug("Not implemented event condition type: %d", (int)condition.condition);
|
||||||
|
//TODO: support new condition format
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
logGlobal->error("Invalid event condition type: %d", (int)condition.condition);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
assert(0);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerColor CGameState::checkForStandardWin() const
|
PlayerColor CGameState::checkForStandardWin() const
|
||||||
@ -3126,7 +3171,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname)
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(n["heroid"].getType() == JsonNode::DATA_FLOAT)
|
if(n["heroid"].isNumber())
|
||||||
ss.heroId = n["heroid"].Float();
|
ss.heroId = n["heroid"].Float();
|
||||||
else
|
else
|
||||||
ss.heroId = -1;
|
ss.heroId = -1;
|
||||||
@ -3169,7 +3214,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
assert(n.getType() == JsonNode::DATA_FLOAT);
|
assert(n.isNumber());
|
||||||
oi->ID = 21;
|
oi->ID = 21;
|
||||||
oi->pos = n.Float();
|
oi->pos = n.Float();
|
||||||
}
|
}
|
||||||
@ -3183,7 +3228,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname)
|
|||||||
cc.id = n["id"].Float();
|
cc.id = n["id"].Float();
|
||||||
|
|
||||||
#define retrieve(name) \
|
#define retrieve(name) \
|
||||||
if(n[ #name ].getType() == JsonNode::DATA_FLOAT)\
|
if(n[ #name ].isNumber())\
|
||||||
cc.name = n[ #name ].Float(); \
|
cc.name = n[ #name ].Float(); \
|
||||||
else \
|
else \
|
||||||
cc.name = -1;
|
cc.name = -1;
|
||||||
|
@ -281,6 +281,7 @@ CHeroHandler::CHeroHandler()
|
|||||||
for (int i = 0; i < GameConstants::SKILL_QUANTITY; ++i)
|
for (int i = 0; i < GameConstants::SKILL_QUANTITY; ++i)
|
||||||
{
|
{
|
||||||
VLC->modh->identifiers.registerObject("core", "skill", NSecondarySkill::names[i], i);
|
VLC->modh->identifiers.registerObject("core", "skill", NSecondarySkill::names[i], i);
|
||||||
|
VLC->modh->identifiers.registerObject("core", "secondarySkill", NSecondarySkill::names[i], i);
|
||||||
}
|
}
|
||||||
loadObstacles();
|
loadObstacles();
|
||||||
loadTerrains();
|
loadTerrains();
|
||||||
@ -542,7 +543,7 @@ void CHeroHandler::loadObject(std::string scope, std::string name, const JsonNod
|
|||||||
{
|
{
|
||||||
auto object = loadFromJson(data, normalizeIdentifier(scope, "core", name));
|
auto object = loadFromJson(data, normalizeIdentifier(scope, "core", name));
|
||||||
object->ID = HeroTypeID(heroes.size());
|
object->ID = HeroTypeID(heroes.size());
|
||||||
object->imageIndex = heroes.size() + 30; // 2 special frames + some extra portraits
|
object->imageIndex = heroes.size() + GameConstants::HERO_PORTRAIT_SHIFT; // 2 special frames + some extra portraits
|
||||||
|
|
||||||
heroes.push_back(object);
|
heroes.push_back(object);
|
||||||
|
|
||||||
|
@ -181,6 +181,20 @@ boost::optional<si32> CIdentifierStorage::getIdentifier(const JsonNode & name, b
|
|||||||
return boost::optional<si32>();
|
return boost::optional<si32>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::optional<si32> CIdentifierStorage::getIdentifier(std::string scope, std::string fullName, bool silent)
|
||||||
|
{
|
||||||
|
auto pair = splitString(fullName, ':'); // remoteScope:<type.name>
|
||||||
|
auto pair2 = splitString(pair.second, '.'); // type.name
|
||||||
|
auto idList = getPossibleIdentifiers(ObjectCallback(scope, pair.first, pair2.first, pair2.second, std::function<void(si32)>(), silent));
|
||||||
|
|
||||||
|
if (idList.size() == 1)
|
||||||
|
return idList.front().id;
|
||||||
|
if (!silent)
|
||||||
|
logGlobal->errorStream() << "Failed to resolve identifier " << fullName << " of type " << pair2.first << " from mod " << scope;
|
||||||
|
|
||||||
|
return boost::optional<si32>();
|
||||||
|
}
|
||||||
|
|
||||||
void CIdentifierStorage::registerObject(std::string scope, std::string type, std::string name, si32 identifier)
|
void CIdentifierStorage::registerObject(std::string scope, std::string type, std::string name, si32 identifier)
|
||||||
{
|
{
|
||||||
ObjectData data;
|
ObjectData data;
|
||||||
@ -387,6 +401,12 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CContentHandler::ContentTypeHandler::loadCustom()
|
||||||
|
{
|
||||||
|
handler->loadCustom();
|
||||||
|
}
|
||||||
|
|
||||||
void CContentHandler::ContentTypeHandler::afterLoadFinalization()
|
void CContentHandler::ContentTypeHandler::afterLoadFinalization()
|
||||||
{
|
{
|
||||||
handler->afterLoadFinalization();
|
handler->afterLoadFinalization();
|
||||||
@ -426,6 +446,14 @@ bool CContentHandler::loadMod(std::string modName, bool validate)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CContentHandler::loadCustom()
|
||||||
|
{
|
||||||
|
for(auto & handler : handlers)
|
||||||
|
{
|
||||||
|
handler.second.loadCustom();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CContentHandler::afterLoadFinalization()
|
void CContentHandler::afterLoadFinalization()
|
||||||
{
|
{
|
||||||
for(auto & handler : handlers)
|
for(auto & handler : handlers)
|
||||||
@ -574,8 +602,10 @@ CModHandler::CModHandler()
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(int i=0; i<GameConstants::PRIMARY_SKILLS; ++i)
|
for(int i=0; i<GameConstants::PRIMARY_SKILLS; ++i)
|
||||||
|
{
|
||||||
identifiers.registerObject("core", "primSkill", PrimarySkill::names[i], i);
|
identifiers.registerObject("core", "primSkill", PrimarySkill::names[i], i);
|
||||||
|
identifiers.registerObject("core", "primarySkill", PrimarySkill::names[i], i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CModHandler::~CModHandler()
|
CModHandler::~CModHandler()
|
||||||
@ -918,6 +948,8 @@ void CModHandler::load()
|
|||||||
for(const TModID & modName : activeMods)
|
for(const TModID & modName : activeMods)
|
||||||
content.load(allMods[modName]);
|
content.load(allMods[modName]);
|
||||||
|
|
||||||
|
content.loadCustom();
|
||||||
|
|
||||||
logGlobal->infoStream() << "\tLoading mod data: " << timer.getDiff() << "ms";
|
logGlobal->infoStream() << "\tLoading mod data: " << timer.getDiff() << "ms";
|
||||||
|
|
||||||
VLC->creh->loadCrExpBon();
|
VLC->creh->loadCrExpBon();
|
||||||
@ -946,7 +978,7 @@ void CModHandler::afterLoad()
|
|||||||
file << modSettings;
|
file << modSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CModHandler::normalizeIdentifier(const std::string & scope, const std::string & remoteScope, const std::string & identifier) const
|
std::string CModHandler::normalizeIdentifier(const std::string & scope, const std::string & remoteScope, const std::string & identifier)
|
||||||
{
|
{
|
||||||
auto p = splitString(identifier, ':');
|
auto p = splitString(identifier, ':');
|
||||||
|
|
||||||
@ -956,5 +988,35 @@ std::string CModHandler::normalizeIdentifier(const std::string & scope, const st
|
|||||||
if(p.first == remoteScope)
|
if(p.first == remoteScope)
|
||||||
p.first.clear();
|
p.first.clear();
|
||||||
|
|
||||||
return p.first.empty() ? p.second : p.first +":"+p.second;
|
return p.first.empty() ? p.second : p.first + ":" + p.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CModHandler::parseIdentifier(const std::string & fullIdentifier, std::string & scope, std::string & type, std::string & identifier)
|
||||||
|
{
|
||||||
|
auto p = splitString(fullIdentifier, ':');
|
||||||
|
|
||||||
|
scope = p.first;
|
||||||
|
|
||||||
|
auto p2 = splitString(p.second, '.');
|
||||||
|
|
||||||
|
if(p2.first != "")
|
||||||
|
{
|
||||||
|
type = p2.first;
|
||||||
|
identifier = p2.second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type = p.second;
|
||||||
|
identifier = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CModHandler::makeFullIdentifier(const std::string & scope, const std::string & type, const std::string & identifier)
|
||||||
|
{
|
||||||
|
auto p = splitString(identifier, ':');
|
||||||
|
|
||||||
|
if(p.first != "")
|
||||||
|
return p.first + ":" + type + "." + p.second;//ignore type if identifier is scoped
|
||||||
|
else
|
||||||
|
return scope == "" ? (identifier == "" ? type : type + "." + identifier) : scope + ":" + type + "." + identifier;
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,7 @@ public:
|
|||||||
boost::optional<si32> getIdentifier(std::string scope, std::string type, std::string name, bool silent = false);
|
boost::optional<si32> getIdentifier(std::string scope, std::string type, std::string name, bool silent = false);
|
||||||
boost::optional<si32> getIdentifier(std::string type, const JsonNode & name, bool silent = false);
|
boost::optional<si32> getIdentifier(std::string type, const JsonNode & name, bool silent = false);
|
||||||
boost::optional<si32> getIdentifier(const JsonNode & name, bool silent = false);
|
boost::optional<si32> getIdentifier(const JsonNode & name, bool silent = false);
|
||||||
|
boost::optional<si32> getIdentifier(std::string scope, std::string fullName, bool silent = false);
|
||||||
|
|
||||||
/// registers new object
|
/// registers new object
|
||||||
void registerObject(std::string scope, std::string type, std::string name, si32 identifier);
|
void registerObject(std::string scope, std::string type, std::string name, si32 identifier);
|
||||||
@ -132,6 +133,7 @@ class CContentHandler
|
|||||||
/// returns true if loading was successful
|
/// returns true if loading was successful
|
||||||
bool preloadModData(std::string modName, std::vector<std::string> fileList, bool validate);
|
bool preloadModData(std::string modName, std::vector<std::string> fileList, bool validate);
|
||||||
bool loadMod(std::string modName, bool validate);
|
bool loadMod(std::string modName, bool validate);
|
||||||
|
void loadCustom();
|
||||||
void afterLoadFinalization();
|
void afterLoadFinalization();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -152,6 +154,8 @@ public:
|
|||||||
/// actually loads data in mod
|
/// actually loads data in mod
|
||||||
void load(CModInfo & mod);
|
void load(CModInfo & mod);
|
||||||
|
|
||||||
|
void loadCustom();
|
||||||
|
|
||||||
/// all data was loaded, time for final validation / integration
|
/// all data was loaded, time for final validation / integration
|
||||||
void afterLoadFinalization();
|
void afterLoadFinalization();
|
||||||
};
|
};
|
||||||
@ -297,7 +301,11 @@ public:
|
|||||||
CModHandler();
|
CModHandler();
|
||||||
virtual ~CModHandler();
|
virtual ~CModHandler();
|
||||||
|
|
||||||
std::string normalizeIdentifier(const std::string & scope, const std::string & remoteScope, const std::string & identifier) const;
|
static std::string normalizeIdentifier(const std::string & scope, const std::string & remoteScope, const std::string & identifier);
|
||||||
|
|
||||||
|
static void parseIdentifier(const std::string & fullIdentifier, std::string & scope, std::string & type, std::string & identifier);
|
||||||
|
|
||||||
|
static std::string makeFullIdentifier(const std::string & scope, const std::string & type, const std::string & identifier);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
|
@ -82,7 +82,7 @@ CFaction::~CFaction()
|
|||||||
CTown::CTown()
|
CTown::CTown()
|
||||||
: faction(nullptr), mageLevel(0), primaryRes(0), moatDamage(0), defaultTavernChance(0)
|
: faction(nullptr), mageLevel(0), primaryRes(0), moatDamage(0), defaultTavernChance(0)
|
||||||
{
|
{
|
||||||
|
faction = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTown::~CTown()
|
CTown::~CTown()
|
||||||
@ -100,13 +100,47 @@ std::vector<BattleHex> CTown::defaultMoatHexes()
|
|||||||
return moatHexes;
|
return moatHexes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CTown::getFactionName() const
|
||||||
|
{
|
||||||
|
if(faction == nullptr)
|
||||||
|
return "Random";
|
||||||
|
else
|
||||||
|
return faction->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CTown::getBuildingScope() const
|
||||||
|
{
|
||||||
|
if(faction == nullptr)
|
||||||
|
//no faction == random faction
|
||||||
|
return "building";
|
||||||
|
else
|
||||||
|
return "building." + faction->identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::set<si32> CTown::getAllBuildings() const
|
||||||
|
{
|
||||||
|
std::set<si32> res;
|
||||||
|
|
||||||
|
for(const auto & b : buildings)
|
||||||
|
{
|
||||||
|
res.insert(b.first.num);
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::move(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CTownHandler::CTownHandler()
|
CTownHandler::CTownHandler()
|
||||||
{
|
{
|
||||||
VLC->townh = this;
|
VLC->townh = this;
|
||||||
|
|
||||||
|
randomTown = new CTown();
|
||||||
}
|
}
|
||||||
|
|
||||||
CTownHandler::~CTownHandler()
|
CTownHandler::~CTownHandler()
|
||||||
{
|
{
|
||||||
|
delete randomTown;
|
||||||
|
|
||||||
for(auto faction : factions)
|
for(auto faction : factions)
|
||||||
faction.dellNull();
|
faction.dellNull();
|
||||||
}
|
}
|
||||||
@ -120,8 +154,6 @@ JsonNode readBuilding(CLegacyConfigParser & parser)
|
|||||||
for(const std::string & resID : GameConstants::RESOURCE_NAMES)
|
for(const std::string & resID : GameConstants::RESOURCE_NAMES)
|
||||||
cost[resID].Float() = parser.readNumber();
|
cost[resID].Float() = parser.readNumber();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cost.Struct().erase("mithril"); // erase mithril to avoid confusing validator
|
cost.Struct().erase("mithril"); // erase mithril to avoid confusing validator
|
||||||
|
|
||||||
parser.endLine();
|
parser.endLine();
|
||||||
@ -283,28 +315,28 @@ std::vector<JsonNode> CTownHandler::loadLegacyData(size_t dataSize)
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTownHandler::loadBuildingRequirements(CTown &town, CBuilding & building, const JsonNode & source)
|
void CTownHandler::loadBuildingRequirements(CBuilding * building, const JsonNode & source)
|
||||||
{
|
{
|
||||||
if (source.isNull())
|
if (source.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BuildingRequirementsHelper hlp;
|
BuildingRequirementsHelper hlp;
|
||||||
hlp.building = &building;
|
hlp.building = building;
|
||||||
hlp.faction = town.faction;
|
hlp.town = building->town;
|
||||||
hlp.json = source;
|
hlp.json = source;
|
||||||
requirementsToLoad.push_back(hlp);
|
requirementsToLoad.push_back(hlp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTownHandler::loadBuilding(CTown &town, const std::string & stringID, const JsonNode & source)
|
void CTownHandler::loadBuilding(CTown * town, const std::string & stringID, const JsonNode & source)
|
||||||
{
|
{
|
||||||
auto ret = new CBuilding;
|
auto ret = new CBuilding;
|
||||||
|
|
||||||
static const std::string modes [] = {"normal", "auto", "special", "grail"};
|
static const std::string modes [] = {"normal", "auto", "special", "grail"};
|
||||||
|
|
||||||
ret->mode = static_cast<CBuilding::EBuildMode>(boost::find(modes, source["mode"].String()) - modes);
|
ret->mode = static_cast<CBuilding::EBuildMode>(boost::find(modes, source["mode"].String()) - modes);
|
||||||
|
|
||||||
ret->identifier = stringID;
|
ret->identifier = stringID;
|
||||||
ret->town = &town;
|
ret->town = town;
|
||||||
ret->bid = BuildingID(source["id"].Float());
|
ret->bid = BuildingID(source["id"].Float());
|
||||||
ret->name = source["name"].String();
|
ret->name = source["name"].String();
|
||||||
ret->description = source["description"].String();
|
ret->description = source["description"].String();
|
||||||
@ -339,7 +371,7 @@ void CTownHandler::loadBuilding(CTown &town, const std::string & stringID, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadBuildingRequirements(town, *ret, source["requires"]);
|
loadBuildingRequirements(ret, source["requires"]);
|
||||||
|
|
||||||
if (!source["upgrades"].isNull())
|
if (!source["upgrades"].isNull())
|
||||||
{
|
{
|
||||||
@ -347,10 +379,10 @@ void CTownHandler::loadBuilding(CTown &town, const std::string & stringID, const
|
|||||||
if(stringID == source["upgrades"].String())
|
if(stringID == source["upgrades"].String())
|
||||||
{
|
{
|
||||||
throw std::runtime_error(boost::str(boost::format("Building with ID '%s' of town '%s' can't be an upgrade of the same building.") %
|
throw std::runtime_error(boost::str(boost::format("Building with ID '%s' of town '%s' can't be an upgrade of the same building.") %
|
||||||
stringID % town.faction->name));
|
stringID % ret->town->getFactionName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
VLC->modh->identifiers.requestIdentifier("building." + town.faction->identifier, source["upgrades"], [=](si32 identifier)
|
VLC->modh->identifiers.requestIdentifier(ret->town->getBuildingScope(), source["upgrades"], [=](si32 identifier)
|
||||||
{
|
{
|
||||||
ret->upgrade = BuildingID(identifier);
|
ret->upgrade = BuildingID(identifier);
|
||||||
});
|
});
|
||||||
@ -358,13 +390,14 @@ void CTownHandler::loadBuilding(CTown &town, const std::string & stringID, const
|
|||||||
else
|
else
|
||||||
ret->upgrade = BuildingID::NONE;
|
ret->upgrade = BuildingID::NONE;
|
||||||
|
|
||||||
town.buildings[ret->bid] = ret;
|
ret->town->buildings[ret->bid] = ret;
|
||||||
VLC->modh->identifiers.registerObject(source.meta, "building." + town.faction->identifier, ret->identifier, ret->bid);
|
|
||||||
|
VLC->modh->identifiers.registerObject(source.meta, ret->town->getBuildingScope(), ret->identifier, ret->bid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTownHandler::loadBuildings(CTown &town, const JsonNode & source)
|
void CTownHandler::loadBuildings(CTown * town, const JsonNode & source)
|
||||||
{
|
{
|
||||||
for(auto &node : source.Struct())
|
for(auto & node : source.Struct())
|
||||||
{
|
{
|
||||||
if (!node.second.isNull())
|
if (!node.second.isNull())
|
||||||
{
|
{
|
||||||
@ -624,7 +657,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source)
|
|||||||
town.dwellingNames.push_back (d["name"].String());
|
town.dwellingNames.push_back (d["name"].String());
|
||||||
}
|
}
|
||||||
|
|
||||||
loadBuildings(town, source["buildings"]);
|
loadBuildings(&town, source["buildings"]);
|
||||||
loadClientData(town,source);
|
loadClientData(town,source);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -756,6 +789,20 @@ void CTownHandler::loadObject(std::string scope, std::string name, const JsonNod
|
|||||||
VLC->modh->identifiers.registerObject(scope, "faction", name, object->index);
|
VLC->modh->identifiers.registerObject(scope, "faction", name, object->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CTownHandler::loadRandomFaction()
|
||||||
|
{
|
||||||
|
static const ResourceID randomFactionPath("config/factions/random.json");
|
||||||
|
|
||||||
|
JsonNode randomFactionJson(randomFactionPath);
|
||||||
|
randomFactionJson.setMeta("core", true);
|
||||||
|
loadBuildings(randomTown, randomFactionJson["random"]["town"]["buildings"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTownHandler::loadCustom()
|
||||||
|
{
|
||||||
|
loadRandomFaction();
|
||||||
|
}
|
||||||
|
|
||||||
void CTownHandler::afterLoadFinalization()
|
void CTownHandler::afterLoadFinalization()
|
||||||
{
|
{
|
||||||
initializeRequirements();
|
initializeRequirements();
|
||||||
@ -773,7 +820,7 @@ void CTownHandler::initializeRequirements()
|
|||||||
logGlobal->warnStream() << "Unexpected length of town buildings requirements: " << node.Vector().size();
|
logGlobal->warnStream() << "Unexpected length of town buildings requirements: " << node.Vector().size();
|
||||||
logGlobal->warnStream() << "Entry contains " << node;
|
logGlobal->warnStream() << "Entry contains " << node;
|
||||||
}
|
}
|
||||||
return BuildingID(VLC->modh->identifiers.getIdentifier("building." + requirement.faction->identifier, node.Vector()[0]).get());
|
return BuildingID(VLC->modh->identifiers.getIdentifier(requirement.town->getBuildingScope(), node.Vector()[0]).get());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
requirementsToLoad.clear();
|
requirementsToLoad.clear();
|
||||||
@ -788,6 +835,7 @@ std::vector<bool> CTownHandler::getDefaultAllowed() const
|
|||||||
}
|
}
|
||||||
return allowedFactions;
|
return allowedFactions;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<TFaction> CTownHandler::getAllowedFactions(bool withTown /*=true*/) const
|
std::set<TFaction> CTownHandler::getAllowedFactions(bool withTown /*=true*/) const
|
||||||
{
|
{
|
||||||
std::set<TFaction> allowedFactions;
|
std::set<TFaction> allowedFactions;
|
||||||
|
@ -143,6 +143,10 @@ public:
|
|||||||
// TODO: remove once save and mod compatability not needed
|
// TODO: remove once save and mod compatability not needed
|
||||||
static std::vector<BattleHex> defaultMoatHexes();
|
static std::vector<BattleHex> defaultMoatHexes();
|
||||||
|
|
||||||
|
std::string getFactionName() const;
|
||||||
|
std::string getBuildingScope() const;
|
||||||
|
std::set<si32> getAllBuildings() const;
|
||||||
|
|
||||||
CFaction * faction;
|
CFaction * faction;
|
||||||
|
|
||||||
std::vector<std::string> names; //names of the town instances
|
std::vector<std::string> names; //names of the town instances
|
||||||
@ -222,16 +226,6 @@ public:
|
|||||||
moatHexes = defaultMoatHexes();
|
moatHexes = defaultMoatHexes();
|
||||||
}
|
}
|
||||||
h & defaultTavernChance;
|
h & defaultTavernChance;
|
||||||
|
|
||||||
auto findNull = [](const std::pair<BuildingID, ConstTransitivePtr<CBuilding>> &building)
|
|
||||||
{ return building.second == nullptr; };
|
|
||||||
|
|
||||||
//Fix #1444 corrupted save
|
|
||||||
while(auto badElem = vstd::tryFindIf(buildings, findNull))
|
|
||||||
{
|
|
||||||
logGlobal->errorStream() << "#1444-like bug encountered in CTown::serialize, fixing buildings list by removing bogus entry " << badElem->first << " from " << faction->name;
|
|
||||||
buildings.erase(badElem->first);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -241,16 +235,16 @@ class DLL_LINKAGE CTownHandler : public IHandlerBase
|
|||||||
{
|
{
|
||||||
JsonNode json;
|
JsonNode json;
|
||||||
CBuilding * building;
|
CBuilding * building;
|
||||||
CFaction * faction;
|
CTown * town;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<BuildingRequirementsHelper> requirementsToLoad;
|
std::vector<BuildingRequirementsHelper> requirementsToLoad;
|
||||||
void initializeRequirements();
|
void initializeRequirements();
|
||||||
|
|
||||||
/// loads CBuilding's into town
|
/// loads CBuilding's into town
|
||||||
void loadBuildingRequirements(CTown &town, CBuilding & building, const JsonNode & source);
|
void loadBuildingRequirements(CBuilding * building, const JsonNode & source);
|
||||||
void loadBuilding(CTown &town, const std::string & stringID, const JsonNode & source);
|
void loadBuilding(CTown * town, const std::string & stringID, const JsonNode & source);
|
||||||
void loadBuildings(CTown &town, const JsonNode & source);
|
void loadBuildings(CTown * town, const JsonNode & source);
|
||||||
|
|
||||||
/// loads CStructure's into town
|
/// loads CStructure's into town
|
||||||
void loadStructure(CTown &town, const std::string & stringID, const JsonNode & source);
|
void loadStructure(CTown &town, const std::string & stringID, const JsonNode & source);
|
||||||
@ -268,9 +262,12 @@ class DLL_LINKAGE CTownHandler : public IHandlerBase
|
|||||||
|
|
||||||
CFaction * loadFromJson(const JsonNode & data, const std::string & identifier);
|
CFaction * loadFromJson(const JsonNode & data, const std::string & identifier);
|
||||||
|
|
||||||
|
void loadRandomFaction();
|
||||||
public:
|
public:
|
||||||
std::vector<ConstTransitivePtr<CFaction> > factions;
|
std::vector<ConstTransitivePtr<CFaction> > factions;
|
||||||
|
|
||||||
|
CTown * randomTown;
|
||||||
|
|
||||||
CTownHandler(); //c-tor, set pointer in VLC to this
|
CTownHandler(); //c-tor, set pointer in VLC to this
|
||||||
~CTownHandler();
|
~CTownHandler();
|
||||||
|
|
||||||
@ -279,6 +276,7 @@ public:
|
|||||||
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
|
void loadObject(std::string scope, std::string name, const JsonNode & data) override;
|
||||||
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
|
void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
|
||||||
|
|
||||||
|
void loadCustom() override;
|
||||||
void afterLoadFinalization() override;
|
void afterLoadFinalization() override;
|
||||||
|
|
||||||
std::vector<bool> getDefaultAllowed() const override;
|
std::vector<bool> getDefaultAllowed() const override;
|
||||||
@ -293,5 +291,14 @@ public:
|
|||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & factions;
|
h & factions;
|
||||||
|
|
||||||
|
if(version >= 770)
|
||||||
|
{
|
||||||
|
h & randomTown;
|
||||||
|
}
|
||||||
|
else if(!h.saving)
|
||||||
|
{
|
||||||
|
loadRandomFaction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -54,11 +54,14 @@ namespace GameConstants
|
|||||||
const int CREATURES_COUNT = 197;
|
const int CREATURES_COUNT = 197;
|
||||||
|
|
||||||
const ui32 BASE_MOVEMENT_COST = 100; //default cost for non-diagonal movement
|
const ui32 BASE_MOVEMENT_COST = 100; //default cost for non-diagonal movement
|
||||||
|
|
||||||
|
const int HERO_PORTRAIT_SHIFT = 30;// 2 special frames + some extra portraits
|
||||||
}
|
}
|
||||||
|
|
||||||
class CArtifact;
|
class CArtifact;
|
||||||
class CArtifactInstance;
|
class CArtifactInstance;
|
||||||
class CCreature;
|
class CCreature;
|
||||||
|
class CHero;
|
||||||
class CSpell;
|
class CSpell;
|
||||||
class CGameInfoCallback;
|
class CGameInfoCallback;
|
||||||
class CNonConstInfoCallback;
|
class CNonConstInfoCallback;
|
||||||
@ -203,7 +206,6 @@ class ArtifactInstanceID : public BaseForID<ArtifactInstanceID, si32>
|
|||||||
friend class CNonConstInfoCallback;
|
friend class CNonConstInfoCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class QueryID : public BaseForID<QueryID, si32>
|
class QueryID : public BaseForID<QueryID, si32>
|
||||||
{
|
{
|
||||||
INSTID_LIKE_CLASS_COMMON(QueryID, si32)
|
INSTID_LIKE_CLASS_COMMON(QueryID, si32)
|
||||||
@ -223,7 +225,6 @@ class ObjectInstanceID : public BaseForID<ObjectInstanceID, si32>
|
|||||||
friend class CNonConstInfoCallback;
|
friend class CNonConstInfoCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class HeroTypeID : public BaseForID<HeroTypeID, si32>
|
class HeroTypeID : public BaseForID<HeroTypeID, si32>
|
||||||
{
|
{
|
||||||
INSTID_LIKE_CLASS_COMMON(HeroTypeID, si32)
|
INSTID_LIKE_CLASS_COMMON(HeroTypeID, si32)
|
||||||
@ -1067,6 +1068,26 @@ enum class ESpellSchool: ui8
|
|||||||
EARTH = 3
|
EARTH = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class EMetaclass: ui8
|
||||||
|
{
|
||||||
|
INVALID = 0,
|
||||||
|
ARTIFACT,
|
||||||
|
CREATURE,
|
||||||
|
FACTION,
|
||||||
|
EXPERIENCE,
|
||||||
|
HERO,
|
||||||
|
HEROCLASS,
|
||||||
|
LUCK,
|
||||||
|
MANA,
|
||||||
|
MORALE,
|
||||||
|
MOVEMENT,
|
||||||
|
OBJECT,
|
||||||
|
PRIMARY_SKILL,
|
||||||
|
SECONDARY_SKILL,
|
||||||
|
SPELL,
|
||||||
|
RESOURCE
|
||||||
|
};
|
||||||
|
|
||||||
// Typedef declarations
|
// Typedef declarations
|
||||||
typedef ui8 TFaction;
|
typedef ui8 TFaction;
|
||||||
typedef si64 TExpType;
|
typedef si64 TExpType;
|
||||||
|
@ -51,7 +51,7 @@ public:
|
|||||||
virtual void setBlockVis(ObjectInstanceID objid, bool bv)=0;
|
virtual void setBlockVis(ObjectInstanceID objid, bool bv)=0;
|
||||||
virtual void setOwner(const CGObjectInstance * objid, PlayerColor owner)=0;
|
virtual void setOwner(const CGObjectInstance * objid, PlayerColor owner)=0;
|
||||||
virtual void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false)=0;
|
virtual void changePrimSkill(const CGHeroInstance * hero, PrimarySkill::PrimarySkill which, si64 val, bool abs=false)=0;
|
||||||
virtual void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false)=0;
|
virtual void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false)=0;
|
||||||
virtual void showBlockingDialog(BlockingDialog *iw) =0;
|
virtual void showBlockingDialog(BlockingDialog *iw) =0;
|
||||||
virtual void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) =0; //cb will be called when player closes garrison window
|
virtual void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) =0; //cb will be called when player closes garrison window
|
||||||
virtual void showTeleportDialog(TeleportDialog *iw) =0;
|
virtual void showTeleportDialog(TeleportDialog *iw) =0;
|
||||||
@ -94,7 +94,6 @@ public:
|
|||||||
virtual void changeObjPos(ObjectInstanceID objid, int3 newPos, ui8 flags)=0;
|
virtual void changeObjPos(ObjectInstanceID objid, int3 newPos, ui8 flags)=0;
|
||||||
virtual void sendAndApply(CPackForClient * info)=0;
|
virtual void sendAndApply(CPackForClient * info)=0;
|
||||||
virtual void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)=0; //when two heroes meet on adventure map
|
virtual void heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)=0; //when two heroes meet on adventure map
|
||||||
virtual void addQuest(int player, QuestInfo & quest){};
|
|
||||||
virtual void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, bool hide) = 0;
|
virtual void changeFogOfWar(int3 center, ui32 radius, PlayerColor player, bool hide) = 0;
|
||||||
virtual void changeFogOfWar(std::unordered_set<int3, ShashInt3> &tiles, PlayerColor player, bool hide) = 0;
|
virtual void changeFogOfWar(std::unordered_set<int3, ShashInt3> &tiles, PlayerColor player, bool hide) = 0;
|
||||||
};
|
};
|
||||||
|
@ -39,6 +39,9 @@ public:
|
|||||||
/// allows handlers to alter object configuration before validation and actual load
|
/// allows handlers to alter object configuration before validation and actual load
|
||||||
virtual void beforeValidate(JsonNode & object){};
|
virtual void beforeValidate(JsonNode & object){};
|
||||||
|
|
||||||
|
/// allows handler to load some custom internal data before identifier finalization
|
||||||
|
virtual void loadCustom(){};
|
||||||
|
|
||||||
/// allows handler to do post-loading step for validation or integration of loaded data
|
/// allows handler to do post-loading step for validation or integration of loaded data
|
||||||
virtual void afterLoadFinalization(){};
|
virtual void afterLoadFinalization(){};
|
||||||
|
|
||||||
|
@ -60,17 +60,17 @@ void JsonWriter::writeEntry(JsonVector::const_iterator entry)
|
|||||||
|
|
||||||
void JsonWriter::writeString(const std::string &string)
|
void JsonWriter::writeString(const std::string &string)
|
||||||
{
|
{
|
||||||
static const std::string escaped = "\"\\\b\f\n\r\t";
|
static const std::string escaped = "\"\\\b\f\n\r\t/";
|
||||||
|
|
||||||
static const std::array<char, 7> escaped_code = {'\"', '\\', 'b', 'f', 'n', 'r', 't'};
|
static const std::array<char, 8> escaped_code = {'\"', '\\', 'b', 'f', 'n', 'r', 't', '/'};
|
||||||
|
|
||||||
out <<'\"';
|
out <<'\"';
|
||||||
size_t pos=0, start=0;
|
size_t pos=0, start=0;
|
||||||
for (; pos<string.size(); pos++)
|
for (; pos<string.size(); pos++)
|
||||||
{
|
{
|
||||||
//we need to check if special character was been already escaped
|
//we need to check if special character was been already escaped
|
||||||
if((string[pos] == '\\')
|
if((string[pos] == '\\')
|
||||||
&& (pos+1 < string.size())
|
&& (pos+1 < string.size())
|
||||||
&& (std::find(escaped_code.begin(), escaped_code.end(), string[pos+1]) != escaped_code.end()) )
|
&& (std::find(escaped_code.begin(), escaped_code.end(), string[pos+1]) != escaped_code.end()) )
|
||||||
{
|
{
|
||||||
pos++; //write unchanged, next simbol also checked
|
pos++; //write unchanged, next simbol also checked
|
||||||
@ -84,7 +84,7 @@ void JsonWriter::writeString(const std::string &string)
|
|||||||
out.write(string.data()+start, pos - start);
|
out.write(string.data()+start, pos - start);
|
||||||
out << '\\' << escaped_code[escapedPos];
|
out << '\\' << escaped_code[escapedPos];
|
||||||
start = pos+1;
|
start = pos+1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -120,6 +120,8 @@ void JsonWriter::writeNode(const JsonNode &node)
|
|||||||
out << "{" << "\n";
|
out << "{" << "\n";
|
||||||
writeContainer(node.Struct().begin(), node.Struct().end());
|
writeContainer(node.Struct().begin(), node.Struct().end());
|
||||||
out << prefix << "}";
|
out << prefix << "}";
|
||||||
|
break; case JsonNode::DATA_INTEGER:
|
||||||
|
out << node.Integer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,6 +254,7 @@ bool JsonParser::extractEscaping(std::string &str)
|
|||||||
break; case 'n': str += '\n';
|
break; case 'n': str += '\n';
|
||||||
break; case 'r': str += '\r';
|
break; case 'r': str += '\r';
|
||||||
break; case 't': str += '\t';
|
break; case 't': str += '\t';
|
||||||
|
break; case '/': str += '/';
|
||||||
break; default: return error("Unknown escape sequence!", true);
|
break; default: return error("Unknown escape sequence!", true);
|
||||||
};
|
};
|
||||||
return true;
|
return true;
|
||||||
@ -458,6 +461,8 @@ bool JsonParser::extractFloat(JsonNode &node)
|
|||||||
assert(input[pos] == '-' || (input[pos] >= '0' && input[pos] <= '9'));
|
assert(input[pos] == '-' || (input[pos] >= '0' && input[pos] <= '9'));
|
||||||
bool negative=false;
|
bool negative=false;
|
||||||
double result=0;
|
double result=0;
|
||||||
|
si64 integerPart = 0;
|
||||||
|
bool isFloat = false;
|
||||||
|
|
||||||
if (input[pos] == '-')
|
if (input[pos] == '-')
|
||||||
{
|
{
|
||||||
@ -471,13 +476,16 @@ bool JsonParser::extractFloat(JsonNode &node)
|
|||||||
//Extract integer part
|
//Extract integer part
|
||||||
while (input[pos] >= '0' && input[pos] <= '9')
|
while (input[pos] >= '0' && input[pos] <= '9')
|
||||||
{
|
{
|
||||||
result = result*10+(input[pos]-'0');
|
integerPart = integerPart*10+(input[pos]-'0');
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = integerPart;
|
||||||
|
|
||||||
if (input[pos] == '.')
|
if (input[pos] == '.')
|
||||||
{
|
{
|
||||||
//extract fractional part
|
//extract fractional part
|
||||||
|
isFloat = true;
|
||||||
pos++;
|
pos++;
|
||||||
double fractMult = 0.1;
|
double fractMult = 0.1;
|
||||||
if (input[pos] < '0' || input[pos] > '9')
|
if (input[pos] < '0' || input[pos] > '9')
|
||||||
@ -490,12 +498,57 @@ bool JsonParser::extractFloat(JsonNode &node)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//TODO: exponential part
|
|
||||||
if (negative)
|
|
||||||
result = -result;
|
|
||||||
|
|
||||||
node.setType(JsonNode::DATA_FLOAT);
|
if(input[pos] == 'e')
|
||||||
node.Float() = result;
|
{
|
||||||
|
//extract exponential part
|
||||||
|
pos++;
|
||||||
|
isFloat = true;
|
||||||
|
bool powerNegative = false;
|
||||||
|
double power = 0;
|
||||||
|
|
||||||
|
if(input[pos] == '-')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
powerNegative = true;
|
||||||
|
}
|
||||||
|
else if(input[pos] == '+')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input[pos] < '0' || input[pos] > '9')
|
||||||
|
return error("Exponential part expected!");
|
||||||
|
|
||||||
|
while (input[pos] >= '0' && input[pos] <= '9')
|
||||||
|
{
|
||||||
|
power = power*10 + (input[pos]-'0');
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(powerNegative)
|
||||||
|
power = -power;
|
||||||
|
|
||||||
|
result *= std::pow(10, power);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isFloat)
|
||||||
|
{
|
||||||
|
if(negative)
|
||||||
|
result = -result;
|
||||||
|
|
||||||
|
node.setType(JsonNode::DATA_FLOAT);
|
||||||
|
node.Float() = result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(negative)
|
||||||
|
integerPart = -integerPart;
|
||||||
|
|
||||||
|
node.setType(JsonNode::DATA_INTEGER);
|
||||||
|
node.Integer() = integerPart;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,13 +566,15 @@ bool JsonParser::error(const std::string &message, bool warning)
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//TODO: integer support
|
||||||
|
|
||||||
static const std::unordered_map<std::string, JsonNode::JsonType> stringToType =
|
static const std::unordered_map<std::string, JsonNode::JsonType> stringToType =
|
||||||
{
|
{
|
||||||
{"null", JsonNode::DATA_NULL},
|
{"null", JsonNode::DATA_NULL},
|
||||||
{"boolean", JsonNode::DATA_BOOL},
|
{"boolean", JsonNode::DATA_BOOL},
|
||||||
{"number", JsonNode::DATA_FLOAT},
|
{"number", JsonNode::DATA_FLOAT},
|
||||||
{"string", JsonNode::DATA_STRING},
|
{"string", JsonNode::DATA_STRING},
|
||||||
{"array", JsonNode::DATA_VECTOR},
|
{"array", JsonNode::DATA_VECTOR},
|
||||||
{"object", JsonNode::DATA_STRUCT}
|
{"object", JsonNode::DATA_STRUCT}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -612,8 +667,13 @@ namespace
|
|||||||
{
|
{
|
||||||
return validator.makeErrorMessage("Unknown type in schema:" + typeName);
|
return validator.makeErrorMessage("Unknown type in schema:" + typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonNode::JsonType type = it->second;
|
JsonNode::JsonType type = it->second;
|
||||||
|
|
||||||
|
//FIXME: hack for integer values
|
||||||
|
if(data.isNumber() && type == JsonNode::DATA_FLOAT)
|
||||||
|
return "";
|
||||||
|
|
||||||
if(type != data.getType() && data.getType() != JsonNode::DATA_NULL)
|
if(type != data.getType() && data.getType() != JsonNode::DATA_NULL)
|
||||||
return validator.makeErrorMessage("Type mismatch! Expected " + schema.String());
|
return validator.makeErrorMessage("Type mismatch! Expected " + schema.String());
|
||||||
return "";
|
return "";
|
||||||
@ -969,7 +1029,7 @@ namespace
|
|||||||
return testAnimation(node.String().substr(0, node.String().find(':')), node.meta);
|
return testAnimation(node.String().substr(0, node.String().find(':')), node.meta);
|
||||||
return "Image file \"" + node.String() + "\" was not found";
|
return "Image file \"" + node.String() + "\" was not found";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string videoFile(const JsonNode & node)
|
std::string videoFile(const JsonNode & node)
|
||||||
{
|
{
|
||||||
TEST_FILE(node.meta, "Video/", node.String(), EResType::VIDEO);
|
TEST_FILE(node.meta, "Video/", node.String(), EResType::VIDEO);
|
||||||
@ -1128,7 +1188,9 @@ namespace Validation
|
|||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case JsonNode::DATA_FLOAT: return numberFields;
|
case JsonNode::DATA_FLOAT:
|
||||||
|
case JsonNode::DATA_INTEGER:
|
||||||
|
return numberFields;
|
||||||
case JsonNode::DATA_STRING: return stringFields;
|
case JsonNode::DATA_STRING: return stringFields;
|
||||||
case JsonNode::DATA_VECTOR: return vectorFields;
|
case JsonNode::DATA_VECTOR: return vectorFields;
|
||||||
case JsonNode::DATA_STRUCT: return structFields;
|
case JsonNode::DATA_STRUCT: return structFields;
|
||||||
|
@ -83,11 +83,12 @@ JsonNode::JsonNode(const JsonNode ©):
|
|||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
break; case DATA_NULL:
|
break; case DATA_NULL:
|
||||||
break; case DATA_BOOL: Bool() = copy.Bool();
|
break; case DATA_BOOL: Bool() = copy.Bool();
|
||||||
break; case DATA_FLOAT: Float() = copy.Float();
|
break; case DATA_FLOAT: Float() = copy.Float();
|
||||||
break; case DATA_STRING: String() = copy.String();
|
break; case DATA_STRING: String() = copy.String();
|
||||||
break; case DATA_VECTOR: Vector() = copy.Vector();
|
break; case DATA_VECTOR: Vector() = copy.Vector();
|
||||||
break; case DATA_STRUCT: Struct() = copy.Struct();
|
break; case DATA_STRUCT: Struct() = copy.Struct();
|
||||||
|
break; case DATA_INTEGER:Integer() = copy.Integer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,6 +123,7 @@ bool JsonNode::operator == (const JsonNode &other) const
|
|||||||
case DATA_STRING: return String() == other.String();
|
case DATA_STRING: return String() == other.String();
|
||||||
case DATA_VECTOR: return Vector() == other.Vector();
|
case DATA_VECTOR: return Vector() == other.Vector();
|
||||||
case DATA_STRUCT: return Struct() == other.Struct();
|
case DATA_STRUCT: return Struct() == other.Struct();
|
||||||
|
case DATA_INTEGER:return Integer()== other.Integer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -167,6 +169,22 @@ void JsonNode::setType(JsonType Type)
|
|||||||
if (type == Type)
|
if (type == Type)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
//float<->int conversion
|
||||||
|
if(type == DATA_FLOAT && Type == DATA_INTEGER)
|
||||||
|
{
|
||||||
|
si64 converted = data.Float;
|
||||||
|
type = Type;
|
||||||
|
data.Integer = converted;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(type == DATA_INTEGER && Type == DATA_FLOAT)
|
||||||
|
{
|
||||||
|
double converted = data.Integer;
|
||||||
|
type = Type;
|
||||||
|
data.Float = converted;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//Reset node to nullptr
|
//Reset node to nullptr
|
||||||
if (Type != DATA_NULL)
|
if (Type != DATA_NULL)
|
||||||
setType(DATA_NULL);
|
setType(DATA_NULL);
|
||||||
@ -189,6 +207,7 @@ void JsonNode::setType(JsonType Type)
|
|||||||
break; case DATA_STRING: data.String = new std::string();
|
break; case DATA_STRING: data.String = new std::string();
|
||||||
break; case DATA_VECTOR: data.Vector = new JsonVector();
|
break; case DATA_VECTOR: data.Vector = new JsonVector();
|
||||||
break; case DATA_STRUCT: data.Struct = new JsonMap();
|
break; case DATA_STRUCT: data.Struct = new JsonMap();
|
||||||
|
break; case DATA_INTEGER: data.Integer = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,6 +216,11 @@ bool JsonNode::isNull() const
|
|||||||
return type == DATA_NULL;
|
return type == DATA_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool JsonNode::isNumber() const
|
||||||
|
{
|
||||||
|
return type == DATA_INTEGER || type == DATA_FLOAT;
|
||||||
|
}
|
||||||
|
|
||||||
void JsonNode::clear()
|
void JsonNode::clear()
|
||||||
{
|
{
|
||||||
setType(DATA_NULL);
|
setType(DATA_NULL);
|
||||||
@ -214,6 +238,12 @@ double & JsonNode::Float()
|
|||||||
return data.Float;
|
return data.Float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
si64 & JsonNode::Integer()
|
||||||
|
{
|
||||||
|
setType(DATA_INTEGER);
|
||||||
|
return data.Integer;
|
||||||
|
}
|
||||||
|
|
||||||
std::string & JsonNode::String()
|
std::string & JsonNode::String()
|
||||||
{
|
{
|
||||||
setType(DATA_STRING);
|
setType(DATA_STRING);
|
||||||
@ -233,7 +263,7 @@ JsonMap & JsonNode::Struct()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bool boolDefault = false;
|
const bool boolDefault = false;
|
||||||
const bool & JsonNode::Bool() const
|
bool JsonNode::Bool() const
|
||||||
{
|
{
|
||||||
if (type == DATA_NULL)
|
if (type == DATA_NULL)
|
||||||
return boolDefault;
|
return boolDefault;
|
||||||
@ -242,14 +272,29 @@ const bool & JsonNode::Bool() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
const double floatDefault = 0;
|
const double floatDefault = 0;
|
||||||
const double & JsonNode::Float() const
|
double JsonNode::Float() const
|
||||||
{
|
{
|
||||||
if (type == DATA_NULL)
|
if(type == DATA_NULL)
|
||||||
return floatDefault;
|
return floatDefault;
|
||||||
|
else if(type == DATA_INTEGER)
|
||||||
|
return data.Integer;
|
||||||
|
|
||||||
assert(type == DATA_FLOAT);
|
assert(type == DATA_FLOAT);
|
||||||
return data.Float;
|
return data.Float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const si64 integetDefault = 0;
|
||||||
|
si64 JsonNode::Integer() const
|
||||||
|
{
|
||||||
|
if(type == DATA_NULL)
|
||||||
|
return integetDefault;
|
||||||
|
else if(type == DATA_FLOAT)
|
||||||
|
return data.Float;
|
||||||
|
|
||||||
|
assert(type == DATA_INTEGER);
|
||||||
|
return data.Integer;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string stringDefault = std::string();
|
const std::string stringDefault = std::string();
|
||||||
const std::string & JsonNode::String() const
|
const std::string & JsonNode::String() const
|
||||||
{
|
{
|
||||||
@ -385,6 +430,9 @@ void JsonUtils::resolveIdentifier(si32 &var, const JsonNode &node, std::string n
|
|||||||
{
|
{
|
||||||
switch (value.getType())
|
switch (value.getType())
|
||||||
{
|
{
|
||||||
|
case JsonNode::DATA_INTEGER:
|
||||||
|
var = value.Integer();
|
||||||
|
break;
|
||||||
case JsonNode::DATA_FLOAT:
|
case JsonNode::DATA_FLOAT:
|
||||||
var = value.Float();
|
var = value.Float();
|
||||||
break;
|
break;
|
||||||
@ -404,6 +452,9 @@ void JsonUtils::resolveIdentifier(const JsonNode &node, si32 &var)
|
|||||||
{
|
{
|
||||||
switch (node.getType())
|
switch (node.getType())
|
||||||
{
|
{
|
||||||
|
case JsonNode::DATA_INTEGER:
|
||||||
|
var = node.Integer();
|
||||||
|
break;
|
||||||
case JsonNode::DATA_FLOAT:
|
case JsonNode::DATA_FLOAT:
|
||||||
var = node.Float();
|
var = node.Float();
|
||||||
break;
|
break;
|
||||||
@ -738,6 +789,7 @@ void JsonUtils::merge(JsonNode & dest, JsonNode & source)
|
|||||||
}
|
}
|
||||||
case JsonNode::DATA_BOOL:
|
case JsonNode::DATA_BOOL:
|
||||||
case JsonNode::DATA_FLOAT:
|
case JsonNode::DATA_FLOAT:
|
||||||
|
case JsonNode::DATA_INTEGER:
|
||||||
case JsonNode::DATA_STRING:
|
case JsonNode::DATA_STRING:
|
||||||
case JsonNode::DATA_VECTOR:
|
case JsonNode::DATA_VECTOR:
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,8 @@ public:
|
|||||||
DATA_FLOAT,
|
DATA_FLOAT,
|
||||||
DATA_STRING,
|
DATA_STRING,
|
||||||
DATA_VECTOR,
|
DATA_VECTOR,
|
||||||
DATA_STRUCT
|
DATA_STRUCT,
|
||||||
|
DATA_INTEGER
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -40,6 +41,7 @@ private:
|
|||||||
std::string* String;
|
std::string* String;
|
||||||
JsonVector* Vector;
|
JsonVector* Vector;
|
||||||
JsonMap* Struct;
|
JsonMap* Struct;
|
||||||
|
si64 Integer;
|
||||||
};
|
};
|
||||||
|
|
||||||
JsonType type;
|
JsonType type;
|
||||||
@ -75,19 +77,24 @@ public:
|
|||||||
JsonType getType() const;
|
JsonType getType() const;
|
||||||
|
|
||||||
bool isNull() const;
|
bool isNull() const;
|
||||||
|
bool isNumber() const;
|
||||||
/// removes all data from node and sets type to null
|
/// removes all data from node and sets type to null
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
/// non-const accessors, node will change type on type mismatch
|
/// non-const accessors, node will change type on type mismatch
|
||||||
bool & Bool();
|
bool & Bool();
|
||||||
double & Float();
|
double & Float();
|
||||||
|
si64 & Integer();
|
||||||
std::string & String();
|
std::string & String();
|
||||||
JsonVector & Vector();
|
JsonVector & Vector();
|
||||||
JsonMap & Struct();
|
JsonMap & Struct();
|
||||||
|
|
||||||
/// const accessors, will cause assertion failure on type mismatch
|
/// const accessors, will cause assertion failure on type mismatch
|
||||||
const bool & Bool() const;
|
bool Bool() const;
|
||||||
const double & Float() const;
|
///float and integer allowed
|
||||||
|
double Float() const;
|
||||||
|
///only integer allowed
|
||||||
|
si64 Integer() const;
|
||||||
const std::string & String() const;
|
const std::string & String() const;
|
||||||
const JsonVector & Vector() const;
|
const JsonVector & Vector() const;
|
||||||
const JsonMap & Struct() const;
|
const JsonMap & Struct() const;
|
||||||
@ -118,6 +125,11 @@ public:
|
|||||||
break; case DATA_VECTOR: h & data.Vector;
|
break; case DATA_VECTOR: h & data.Vector;
|
||||||
break; case DATA_STRUCT: h & data.Struct;
|
break; case DATA_STRUCT: h & data.Struct;
|
||||||
}
|
}
|
||||||
|
if(version >= 770)
|
||||||
|
{
|
||||||
|
if(type == DATA_INTEGER)
|
||||||
|
h & data.Integer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -451,12 +451,12 @@ DLL_LINKAGE void RemoveObject::applyGs(CGameState *gs)
|
|||||||
{
|
{
|
||||||
if (cond.object == obj)
|
if (cond.object == obj)
|
||||||
{
|
{
|
||||||
if (cond.condition == EventCondition::DESTROY)
|
if (cond.condition == EventCondition::DESTROY || cond.condition == EventCondition::DESTROY_0)
|
||||||
{
|
{
|
||||||
cond.condition = EventCondition::CONST_VALUE;
|
cond.condition = EventCondition::CONST_VALUE;
|
||||||
cond.value = 1; // destroyed object, from now on always fulfilled
|
cond.value = 1; // destroyed object, from now on always fulfilled
|
||||||
}
|
}
|
||||||
if (cond.condition == EventCondition::CONTROL)
|
else if (cond.condition == EventCondition::CONTROL || cond.condition == EventCondition::HAVE_0)
|
||||||
{
|
{
|
||||||
cond.condition = EventCondition::CONST_VALUE;
|
cond.condition = EventCondition::CONST_VALUE;
|
||||||
cond.value = 0; // destroyed object, from now on can not be fulfilled
|
cond.value = 0; // destroyed object, from now on can not be fulfilled
|
||||||
@ -1629,7 +1629,7 @@ DLL_LINKAGE void StacksHealedOrResurrected::applyGs(CGameState *gs)
|
|||||||
if(canOverheal) //for example WoG ghost soul steal ability allows getting more units than before battle
|
if(canOverheal) //for example WoG ghost soul steal ability allows getting more units than before battle
|
||||||
res = elem.healedHP / changedStack->MaxHealth();
|
res = elem.healedHP / changedStack->MaxHealth();
|
||||||
else
|
else
|
||||||
res = std::min(elem.healedHP / changedStack->MaxHealth() , changedStack->baseAmount - changedStack->count);
|
res = std::min(elem.healedHP / changedStack->MaxHealth() , changedStack->baseAmount - changedStack->count);
|
||||||
changedStack->count += res;
|
changedStack->count += res;
|
||||||
if(elem.lowLevelResurrection)
|
if(elem.lowLevelResurrection)
|
||||||
changedStack->resurrected += res;
|
changedStack->resurrected += res;
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "ResourceSet.h"
|
#include "ResourceSet.h"
|
||||||
#include "StringConstants.h"
|
#include "StringConstants.h"
|
||||||
#include "JsonNode.h"
|
#include "JsonNode.h"
|
||||||
|
#include "serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
Res::ResourceSet::ResourceSet()
|
Res::ResourceSet::ResourceSet()
|
||||||
{
|
{
|
||||||
@ -25,6 +26,19 @@ Res::ResourceSet::ResourceSet(const JsonNode & node)
|
|||||||
push_back(node[name].Float());
|
push_back(node[name].Float());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Res::ResourceSet::serializeJson(JsonSerializeFormat & handler, const std::string & fieldName)
|
||||||
|
{
|
||||||
|
if(!handler.saving)
|
||||||
|
resize(GameConstants::RESOURCE_QUANTITY, 0);
|
||||||
|
if(handler.saving && !nonZero())
|
||||||
|
return;
|
||||||
|
auto s = handler.enterStruct(fieldName);
|
||||||
|
|
||||||
|
//TODO: add proper support for mithril to map format
|
||||||
|
for(int idx = 0; idx < GameConstants::RESOURCE_QUANTITY - 1; idx ++)
|
||||||
|
handler.serializeInt(GameConstants::RESOURCE_NAMES[idx], this->operator[](idx), 0);
|
||||||
|
}
|
||||||
|
|
||||||
bool Res::ResourceSet::nonZero() const
|
bool Res::ResourceSet::nonZero() const
|
||||||
{
|
{
|
||||||
for(auto & elem : *this)
|
for(auto & elem : *this)
|
||||||
|
@ -14,6 +14,7 @@ typedef si32 TResource;
|
|||||||
typedef si64 TResourceCap; //to avoid overflow when adding integers. Signed values are easier to control.
|
typedef si64 TResourceCap; //to avoid overflow when adding integers. Signed values are easier to control.
|
||||||
|
|
||||||
class JsonNode;
|
class JsonNode;
|
||||||
|
class JsonSerializeFormat;
|
||||||
|
|
||||||
namespace Res
|
namespace Res
|
||||||
{
|
{
|
||||||
@ -124,6 +125,8 @@ namespace Res
|
|||||||
h & static_cast<std::vector<int>&>(*this);
|
h & static_cast<std::vector<int>&>(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DLL_LINKAGE void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName);
|
||||||
|
|
||||||
DLL_LINKAGE void amax(const TResourceCap &val); //performs vstd::amax on each element
|
DLL_LINKAGE void amax(const TResourceCap &val); //performs vstd::amax on each element
|
||||||
DLL_LINKAGE void amin(const TResourceCap &val); //performs vstd::amin on each element
|
DLL_LINKAGE void amin(const TResourceCap &val); //performs vstd::amin on each element
|
||||||
DLL_LINKAGE void positive(); //values below 0 are set to 0 - upgrade cost can't be negative, for example
|
DLL_LINKAGE void positive(); //values below 0 are set to 0 - upgrade cost can't be negative, for example
|
||||||
|
@ -53,7 +53,7 @@ namespace NSecondarySkill
|
|||||||
"sorcery", "resistance", "firstAid"
|
"sorcery", "resistance", "firstAid"
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::string levels [4] =
|
const std::vector<std::string> levels =
|
||||||
{
|
{
|
||||||
"none", "basic", "advanced", "expert"
|
"none", "basic", "advanced", "expert"
|
||||||
};
|
};
|
||||||
@ -87,7 +87,7 @@ namespace ETownType
|
|||||||
|
|
||||||
namespace NArtifactPosition
|
namespace NArtifactPosition
|
||||||
{
|
{
|
||||||
const std::string names [19] =
|
const std::string namesHero [19] =
|
||||||
{
|
{
|
||||||
"head", "shoulders", "neck", "rightHand", "leftHand", "torso", //5
|
"head", "shoulders", "neck", "rightHand", "leftHand", "torso", //5
|
||||||
"rightRing", "leftRing", "feet", //8
|
"rightRing", "leftRing", "feet", //8
|
||||||
@ -96,5 +96,27 @@ namespace NArtifactPosition
|
|||||||
"spellbook", "misc5" //18
|
"spellbook", "misc5" //18
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const std::string namesCreature[1] =
|
||||||
|
{
|
||||||
|
"creature1"
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::string namesCommander[6] =
|
||||||
|
{
|
||||||
|
"commander1", "commander2", "commander3", "commander4", "commander5", "commander6",
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const std::string backpack = "backpack";
|
const std::string backpack = "backpack";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace NMetaclass
|
||||||
|
{
|
||||||
|
const std::string names [16] =
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
"artifact", "creature", "faction", "experience", "hero",
|
||||||
|
"heroClass", "luck", "mana", "morale", "movement",
|
||||||
|
"object", "primarySkill", "secondarySkill", "spell", "resource"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "../mapping/CMap.h"
|
#include "../mapping/CMap.h"
|
||||||
#include "CGTownInstance.h"
|
#include "CGTownInstance.h"
|
||||||
#include "../serializer/JsonSerializeFormat.h"
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
#include "../StringConstants.h"
|
||||||
|
|
||||||
///helpers
|
///helpers
|
||||||
static void showInfoDialog(const PlayerColor playerID, const ui32 txtID, const ui16 soundID)
|
static void showInfoDialog(const PlayerColor playerID, const ui32 txtID, const ui16 soundID)
|
||||||
@ -1542,47 +1543,225 @@ bool CGHeroInstance::hasVisions(const CGObjectInstance * target, const int subty
|
|||||||
return (distance < visionsRange) && (target->pos.z == pos.z);
|
return (distance < visionsRange) && (target->pos.z == pos.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGHeroInstance::serializeJsonOptions(JsonSerializeFormat& handler)
|
std::string CGHeroInstance::getHeroTypeName() const
|
||||||
{
|
{
|
||||||
serializeJsonOwner(handler);
|
if(ID == Obj::HERO || ID == Obj::PRISON)
|
||||||
|
|
||||||
if(handler.saving)
|
|
||||||
{
|
{
|
||||||
if(type)
|
if(type)
|
||||||
{
|
{
|
||||||
handler.serializeString("type", type->identifier);
|
return type->identifier;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto temp = VLC->heroh->heroes[subID]->identifier;
|
return VLC->heroh->heroes[subID]->identifier;
|
||||||
handler.serializeString("type", temp);
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGHeroInstance::setHeroTypeName(const std::string & identifier)
|
||||||
|
{
|
||||||
|
if(ID == Obj::HERO || ID == Obj::PRISON)
|
||||||
|
{
|
||||||
|
auto rawId = VLC->modh->identifiers.getIdentifier("core", "hero", identifier);
|
||||||
|
|
||||||
|
if(rawId)
|
||||||
|
subID = rawId.get();
|
||||||
|
else
|
||||||
|
subID = 0; //fallback to Orrin, throw error instead?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGHeroInstance::serializeCommonOptions(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeString("biography", biography);
|
||||||
|
handler.serializeInt("experience", exp, 0);
|
||||||
|
handler.serializeString("name", name);
|
||||||
|
handler.serializeBool<ui8>("female", sex, 1, 0, 0xFF);
|
||||||
|
|
||||||
|
{
|
||||||
|
const int legacyHeroes = VLC->modh->settings.data["textData"]["hero"].Integer();
|
||||||
|
const int moddedStart = legacyHeroes + GameConstants::HERO_PORTRAIT_SHIFT;
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
if(portrait >= 0)
|
||||||
|
{
|
||||||
|
if(portrait < legacyHeroes || portrait >= moddedStart)
|
||||||
|
handler.serializeId("portrait", portrait, -1, &VLC->heroh->decodeHero, &VLC->heroh->encodeHero);
|
||||||
|
else
|
||||||
|
handler.serializeInt("portrait", portrait, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const JsonNode & portraitNode = handler.getCurrent()["portrait"];
|
||||||
|
|
||||||
|
if(portraitNode.getType() == JsonNode::DATA_STRING)
|
||||||
|
handler.serializeId("portrait", portrait, -1, &VLC->heroh->decodeHero, &VLC->heroh->encodeHero);
|
||||||
|
else
|
||||||
|
handler.serializeInt("portrait", portrait, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
bool haveSkills = false;
|
||||||
|
|
||||||
|
for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
|
||||||
|
{
|
||||||
|
if(valOfBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, i).And(Selector::sourceType(Bonus::HERO_BASE_SKILL))) != 0)
|
||||||
|
{
|
||||||
|
haveSkills = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(haveSkills)
|
||||||
|
{
|
||||||
|
auto primarySkills = handler.enterStruct("primarySkills");
|
||||||
|
|
||||||
|
for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
|
||||||
|
{
|
||||||
|
int value = valOfBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, i).And(Selector::sourceType(Bonus::HERO_BASE_SKILL)));
|
||||||
|
|
||||||
|
handler.serializeInt(PrimarySkill::names[i], value, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto primarySkills = handler.enterStruct("primarySkills");
|
||||||
|
|
||||||
|
for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
|
||||||
|
{
|
||||||
|
int value = 0;
|
||||||
|
handler.serializeInt(PrimarySkill::names[i], value, 0);
|
||||||
|
if(value != 0)
|
||||||
|
pushPrimSkill(static_cast<PrimarySkill::PrimarySkill>(i), value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//secondary skills
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
//does hero have default skills?
|
||||||
|
bool defaultSkills = false;
|
||||||
|
bool normalSkills = false;
|
||||||
|
for(const auto & p : secSkills)
|
||||||
|
{
|
||||||
|
if(p.first == SecondarySkill(SecondarySkill::DEFAULT))
|
||||||
|
defaultSkills = true;
|
||||||
|
else
|
||||||
|
normalSkills = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(defaultSkills && normalSkills)
|
||||||
|
logGlobal->error("Mixed default and normal secondary skills");
|
||||||
|
|
||||||
|
//in json default skills means no field/null
|
||||||
|
if(!defaultSkills)
|
||||||
|
{
|
||||||
|
//enter structure here as handler initialize it
|
||||||
|
auto secondarySkills = handler.enterStruct("secondarySkills");
|
||||||
|
|
||||||
|
for(auto & p : secSkills)
|
||||||
|
{
|
||||||
|
const si32 rawId = p.first.num;
|
||||||
|
|
||||||
|
if(rawId < 0 || rawId >= GameConstants::SKILL_QUANTITY)
|
||||||
|
logGlobal->errorStream() << "Invalid secondary skill " << rawId;
|
||||||
|
|
||||||
|
handler.serializeEnum(NSecondarySkill::names[rawId], p.second, 0, NSecondarySkill::levels);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(ID == Obj::HERO || ID == Obj::PRISON)
|
auto secondarySkills = handler.enterStruct("secondarySkills");
|
||||||
|
const JsonNode & skillMap = handler.getCurrent();
|
||||||
|
|
||||||
|
secSkills.clear();
|
||||||
|
if(skillMap.getType() == JsonNode::DATA_NULL)
|
||||||
{
|
{
|
||||||
std::string typeName;
|
secSkills.push_back(std::pair<SecondarySkill,ui8>(SecondarySkill::DEFAULT, -1));
|
||||||
handler.serializeString("type", typeName);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(const auto & p : skillMap.Struct())
|
||||||
|
{
|
||||||
|
const std::string id = p.first;
|
||||||
|
const std::string levelId = p.second.String();
|
||||||
|
|
||||||
auto rawId = VLC->modh->identifiers.getIdentifier("core", "hero", typeName);
|
const int rawId = vstd::find_pos(NSecondarySkill::names, id);
|
||||||
|
if(rawId < 0)
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << "Invalid secondary skill " << id;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(rawId)
|
const int level = vstd::find_pos(NSecondarySkill::levels, levelId);
|
||||||
subID = rawId.get();
|
if(level < 0)
|
||||||
else
|
{
|
||||||
subID = 0; //fallback to Orrin, throw error instead?
|
logGlobal->errorStream() << "Invalid secondary skill level" << levelId;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
secSkills.push_back(std::pair<SecondarySkill,ui8>(SecondarySkill(rawId), level));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CCreatureSet::serializeJson(handler, "army");
|
|
||||||
|
|
||||||
|
handler.serializeIdArray("spellBook", spells, &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell);
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
CArtifactSet::serializeJsonArtifacts(handler, "artifacts", nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGHeroInstance::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
serializeCommonOptions(handler);
|
||||||
|
|
||||||
|
serializeJsonOwner(handler);
|
||||||
|
|
||||||
|
if(ID == Obj::HERO || ID == Obj::PRISON)
|
||||||
{
|
{
|
||||||
auto artifacts = handler.enterStruct("artifacts");
|
std::string typeName;
|
||||||
if(handler.saving)
|
if(handler.saving)
|
||||||
CArtifactSet::writeJson(handler.getCurrent());
|
typeName = getHeroTypeName();
|
||||||
else
|
handler.serializeString("type", typeName);
|
||||||
CArtifactSet::readJson(handler.getCurrent());
|
if(!handler.saving)
|
||||||
|
setHeroTypeName(typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCreatureSet::serializeJson(handler, "army", 7);
|
||||||
|
handler.serializeBool<ui8>("tightFormation", formation, 1, 0, 0);
|
||||||
|
|
||||||
|
{
|
||||||
|
static const int NO_PATROLING = -1;
|
||||||
|
int rawPatrolRadius = NO_PATROLING;
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
rawPatrolRadius = patrol.patrolling ? patrol.patrolRadius : NO_PATROLING;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler.serializeInt("patrolRadius", rawPatrolRadius, NO_PATROLING);
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
patrol.patrolling = (rawPatrolRadius > NO_PATROLING);
|
||||||
|
patrol.initialPos = convertPosition(pos, false);
|
||||||
|
patrol.patrolRadius = (rawPatrolRadius > NO_PATROLING) ? rawPatrolRadius : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGHeroInstance::serializeJsonDefinition(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
serializeCommonOptions(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGHeroInstance::isMissionCritical() const
|
bool CGHeroInstance::isMissionCritical() const
|
||||||
@ -1591,7 +1770,7 @@ bool CGHeroInstance::isMissionCritical() const
|
|||||||
{
|
{
|
||||||
if(event.trigger.test([&](const EventCondition & condition)
|
if(event.trigger.test([&](const EventCondition & condition)
|
||||||
{
|
{
|
||||||
if (condition.condition == EventCondition::CONTROL && condition.object)
|
if ((condition.condition == EventCondition::CONTROL || condition.condition == EventCondition::HAVE_0) && condition.object)
|
||||||
{
|
{
|
||||||
auto hero = dynamic_cast<const CGHeroInstance*>(condition.object);
|
auto hero = dynamic_cast<const CGHeroInstance*>(condition.object);
|
||||||
return (hero != this);
|
return (hero != this);
|
||||||
|
@ -65,8 +65,8 @@ public:
|
|||||||
ConstTransitivePtr<CCommanderInstance> commander;
|
ConstTransitivePtr<CCommanderInstance> commander;
|
||||||
const CGBoat *boat; //set to CGBoat when sailing
|
const CGBoat *boat; //set to CGBoat when sailing
|
||||||
|
|
||||||
static const ui32 UNINITIALIZED_PORTRAIT = -1;
|
static const si32 UNINITIALIZED_PORTRAIT = -1;
|
||||||
static const ui32 UNINITIALIZED_MANA = -1;
|
static const si32 UNINITIALIZED_MANA = -1;
|
||||||
static const ui32 UNINITIALIZED_MOVEMENT = -1;
|
static const ui32 UNINITIALIZED_MOVEMENT = -1;
|
||||||
|
|
||||||
//std::vector<const CArtifact*> artifacts; //hero's artifacts from bag
|
//std::vector<const CArtifact*> artifacts; //hero's artifacts from bag
|
||||||
@ -204,7 +204,7 @@ public:
|
|||||||
void initHero(CRandomGenerator & rand);
|
void initHero(CRandomGenerator & rand);
|
||||||
void initHero(CRandomGenerator & rand, HeroTypeID SUBID);
|
void initHero(CRandomGenerator & rand, HeroTypeID SUBID);
|
||||||
|
|
||||||
void putArtifact(ArtifactPosition pos, CArtifactInstance *art);
|
void putArtifact(ArtifactPosition pos, CArtifactInstance * art) override;
|
||||||
void putInBackpack(CArtifactInstance *art);
|
void putInBackpack(CArtifactInstance *art);
|
||||||
void initExp(CRandomGenerator & rand);
|
void initExp(CRandomGenerator & rand);
|
||||||
void initArmy(CRandomGenerator & rand, IArmyDescriptor *dst = nullptr);
|
void initArmy(CRandomGenerator & rand, IArmyDescriptor *dst = nullptr);
|
||||||
@ -258,12 +258,20 @@ public:
|
|||||||
std::string getObjectName() const override;
|
std::string getObjectName() const override;
|
||||||
protected:
|
protected:
|
||||||
void setPropertyDer(ui8 what, ui32 val) override;//synchr
|
void setPropertyDer(ui8 what, ui32 val) override;//synchr
|
||||||
|
///common part of hero instance and hero definition
|
||||||
|
void serializeCommonOptions(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void levelUpAutomatically(CRandomGenerator & rand);
|
void levelUpAutomatically(CRandomGenerator & rand);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
std::string getHeroTypeName() const;
|
||||||
|
void setHeroTypeName(const std::string & identifier);
|
||||||
|
|
||||||
|
void serializeJsonDefinition(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & static_cast<CArmedInstance&>(*this);
|
h & static_cast<CArmedInstance&>(*this);
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
#include "../spells/CSpellHandler.h"
|
#include "../spells/CSpellHandler.h"
|
||||||
#include "../StartInfo.h"
|
#include "../StartInfo.h"
|
||||||
#include "../IGameCallback.h"
|
#include "../IGameCallback.h"
|
||||||
|
#include "../StringConstants.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
///helpers
|
///helpers
|
||||||
static void showInfoDialog(const PlayerColor playerID, const ui32 txtID, const ui16 soundID)
|
static void showInfoDialog(const PlayerColor playerID, const ui32 txtID, const ui16 soundID)
|
||||||
@ -375,6 +377,85 @@ CGEvent::CGEvent()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGPandoraBox::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
CCreatureSet::serializeJson(handler, "guards", 7);
|
||||||
|
handler.serializeString("guardMessage", message);
|
||||||
|
|
||||||
|
handler.serializeInt("experience", gainedExp, 0);
|
||||||
|
handler.serializeInt("mana", manaDiff, 0);
|
||||||
|
handler.serializeInt("morale", moraleDiff, 0);
|
||||||
|
handler.serializeInt("luck", luckDiff, 0);
|
||||||
|
|
||||||
|
resources.serializeJson(handler, "resources");
|
||||||
|
|
||||||
|
{
|
||||||
|
if(!handler.saving)
|
||||||
|
primskills.resize(GameConstants::PRIMARY_SKILLS,0);
|
||||||
|
|
||||||
|
auto s = handler.enterStruct("primarySkills");
|
||||||
|
for(int idx = 0; idx < primskills.size(); idx ++)
|
||||||
|
handler.serializeInt(PrimarySkill::names[idx], primskills[idx], 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
if(handler.getCurrent()["primarySkills"].Struct().empty())
|
||||||
|
handler.getCurrent().Struct().erase("primarySkills");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
if(!abilities.empty())
|
||||||
|
{
|
||||||
|
auto s = handler.enterStruct("secondarySkills");
|
||||||
|
|
||||||
|
for(size_t idx = 0; idx < abilities.size(); idx++)
|
||||||
|
{
|
||||||
|
handler.serializeEnum(NSecondarySkill::names[abilities[idx]], abilityLevels[idx], NSecondarySkill::levels);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto s = handler.enterStruct("secondarySkills");
|
||||||
|
|
||||||
|
const JsonNode & skillMap = handler.getCurrent();
|
||||||
|
|
||||||
|
abilities.clear();
|
||||||
|
abilityLevels.clear();
|
||||||
|
|
||||||
|
for(const auto & p : skillMap.Struct())
|
||||||
|
{
|
||||||
|
const std::string id = p.first;
|
||||||
|
const std::string levelId = p.second.String();
|
||||||
|
|
||||||
|
const int rawId = vstd::find_pos(NSecondarySkill::names, id);
|
||||||
|
if(rawId < 0)
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << "Invalid secondary skill " << id;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int level = vstd::find_pos(NSecondarySkill::levels, levelId);
|
||||||
|
if(level < 0)
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << "Invalid secondary skill level" << levelId;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
abilities.push_back(SecondarySkill(rawId));
|
||||||
|
abilityLevels.push_back(level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
handler.serializeIdArray("artifacts", artifacts, &CArtHandler::decodeArfifact, &CArtHandler::encodeArtifact);
|
||||||
|
handler.serializeIdArray("spells", spells, &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell);
|
||||||
|
|
||||||
|
creatures.serializeJson(handler, "creatures");
|
||||||
|
}
|
||||||
|
|
||||||
void CGEvent::onHeroVisit( const CGHeroInstance * h ) const
|
void CGEvent::onHeroVisit( const CGHeroInstance * h ) const
|
||||||
{
|
{
|
||||||
if(!(availableFor & (1 << h->tempOwner.getNum())))
|
if(!(availableFor & (1 << h->tempOwner.getNum())))
|
||||||
@ -416,3 +497,26 @@ void CGEvent::afterSuccessfulVisit() const
|
|||||||
else if(hasGuardians)
|
else if(hasGuardians)
|
||||||
hasGuardians = false;
|
hasGuardians = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGEvent::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
CGPandoraBox::serializeJsonOptions(handler);
|
||||||
|
|
||||||
|
handler.serializeBool<bool>("aIActivable", computerActivate, true, false, false);
|
||||||
|
handler.serializeBool<bool>("humanActivable", humanActivate, true, false, true);
|
||||||
|
handler.serializeBool<bool>("removeAfterVisit", removeAfterVisit, true, false, false);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto decodePlayer = [](const std::string & id)->si32
|
||||||
|
{
|
||||||
|
return vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, id);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto encodePlayer = [](si32 idx)->std::string
|
||||||
|
{
|
||||||
|
return GameConstants::PLAYER_COLOR_NAMES[idx];
|
||||||
|
};
|
||||||
|
|
||||||
|
handler.serializeIdArray<ui8, PlayerColor::PLAYER_LIMIT_I>("availableFor", availableFor, GameConstants::ALL_PLAYERS, decodePlayer, encodePlayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
void giveContentsUpToExp(const CGHeroInstance *h) const;
|
void giveContentsUpToExp(const CGHeroInstance *h) const;
|
||||||
void giveContentsAfterExp(const CGHeroInstance *h) const;
|
void giveContentsAfterExp(const CGHeroInstance *h) const;
|
||||||
|
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
||||||
private:
|
private:
|
||||||
void getText( InfoWindow &iw, bool &afterBattle, int val, int negative, int positive, const CGHeroInstance * h ) const;
|
void getText( InfoWindow &iw, bool &afterBattle, int val, int negative, int positive, const CGHeroInstance * h ) const;
|
||||||
void getText( InfoWindow &iw, bool &afterBattle, int text, const CGHeroInstance * h ) const;
|
void getText( InfoWindow &iw, bool &afterBattle, int text, const CGHeroInstance * h ) const;
|
||||||
@ -73,6 +74,8 @@ public:
|
|||||||
|
|
||||||
CGEvent();
|
CGEvent();
|
||||||
void onHeroVisit(const CGHeroInstance * h) const override;
|
void onHeroVisit(const CGHeroInstance * h) const override;
|
||||||
|
protected:
|
||||||
|
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
||||||
private:
|
private:
|
||||||
void activated(const CGHeroInstance * h) const;
|
void activated(const CGHeroInstance * h) const;
|
||||||
void afterSuccessfulVisit() const override;
|
void afterSuccessfulVisit() const override;
|
||||||
|
@ -25,6 +25,64 @@
|
|||||||
std::vector<const CArtifact *> CGTownInstance::merchantArtifacts;
|
std::vector<const CArtifact *> CGTownInstance::merchantArtifacts;
|
||||||
std::vector<int> CGTownInstance::universitySkills;
|
std::vector<int> CGTownInstance::universitySkills;
|
||||||
|
|
||||||
|
void CCreGenAsCastleInfo::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeString("sameAsTown", instanceId);
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
asCastle = (instanceId != "");
|
||||||
|
allowedFactions.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!asCastle)
|
||||||
|
{
|
||||||
|
std::vector<bool> standard;
|
||||||
|
standard.resize(VLC->townh->factions.size(), true);
|
||||||
|
|
||||||
|
JsonSerializeFormat::LIC allowedLIC(standard, &CTownHandler::decodeFaction, &CTownHandler::encodeFaction);
|
||||||
|
allowedLIC.any = allowedFactions;
|
||||||
|
|
||||||
|
handler.serializeLIC("allowedFactions", allowedLIC);
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
allowedFactions = allowedLIC.any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCreGenLeveledInfo::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeInt("minLevel", minLevel, ui8(1));
|
||||||
|
handler.serializeInt("maxLevel", maxLevel, ui8(7));
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
//todo: safely allow any level > 7
|
||||||
|
vstd::amax(minLevel, 1);
|
||||||
|
vstd::amin(minLevel, 7);
|
||||||
|
vstd::abetween(maxLevel, minLevel, 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCreGenLeveledCastleInfo::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
CCreGenAsCastleInfo::serializeJson(handler);
|
||||||
|
CCreGenLeveledInfo::serializeJson(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGDwelling::CGDwelling():
|
||||||
|
CArmedInstance()
|
||||||
|
{
|
||||||
|
info = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGDwelling::~CGDwelling()
|
||||||
|
{
|
||||||
|
vstd::clear_pointer(info);
|
||||||
|
}
|
||||||
|
|
||||||
void CGDwelling::initObj(CRandomGenerator & rand)
|
void CGDwelling::initObj(CRandomGenerator & rand)
|
||||||
{
|
{
|
||||||
switch(ID)
|
switch(ID)
|
||||||
@ -58,6 +116,23 @@ void CGDwelling::initObj(CRandomGenerator & rand)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGDwelling::initRandomObjectInfo()
|
||||||
|
{
|
||||||
|
vstd::clear_pointer(info);
|
||||||
|
switch(ID)
|
||||||
|
{
|
||||||
|
case Obj::RANDOM_DWELLING: info = new CCreGenLeveledCastleInfo();
|
||||||
|
break;
|
||||||
|
case Obj::RANDOM_DWELLING_LVL: info = new CCreGenAsCastleInfo();
|
||||||
|
break;
|
||||||
|
case Obj::RANDOM_DWELLING_FACTION: info = new CCreGenLeveledInfo();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(info)
|
||||||
|
info->owner = this;
|
||||||
|
}
|
||||||
|
|
||||||
void CGDwelling::setPropertyDer(ui8 what, ui32 val)
|
void CGDwelling::setPropertyDer(ui8 what, ui32 val)
|
||||||
{
|
{
|
||||||
switch (what)
|
switch (what)
|
||||||
@ -318,9 +393,24 @@ void CGDwelling::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer)
|
|||||||
|
|
||||||
void CGDwelling::serializeJsonOptions(JsonSerializeFormat & handler)
|
void CGDwelling::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
//todo: CGDwelling::serializeJsonOptions
|
if(!handler.saving)
|
||||||
if(ID != Obj::WAR_MACHINE_FACTORY && ID != Obj::REFUGEE_CAMP)
|
initRandomObjectInfo();
|
||||||
|
|
||||||
|
switch (ID)
|
||||||
|
{
|
||||||
|
case Obj::WAR_MACHINE_FACTORY:
|
||||||
|
case Obj::REFUGEE_CAMP:
|
||||||
|
//do nothing
|
||||||
|
break;
|
||||||
|
case Obj::RANDOM_DWELLING:
|
||||||
|
case Obj::RANDOM_DWELLING_LVL:
|
||||||
|
case Obj::RANDOM_DWELLING_FACTION:
|
||||||
|
info->serializeJson(handler);
|
||||||
|
//fall through
|
||||||
|
default:
|
||||||
serializeJsonOwner(handler);
|
serializeJsonOwner(handler);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int CGTownInstance::getSightRadius() const //returns sight distance
|
int CGTownInstance::getSightRadius() const //returns sight distance
|
||||||
@ -495,7 +585,7 @@ bool CGTownInstance::hasCapitol() const
|
|||||||
return hasBuilt(BuildingID::CAPITOL);
|
return hasBuilt(BuildingID::CAPITOL);
|
||||||
}
|
}
|
||||||
CGTownInstance::CGTownInstance()
|
CGTownInstance::CGTownInstance()
|
||||||
:IShipyard(this), IMarket(this), town(nullptr), builded(0), destroyed(0), identifier(0), alignment(0xff)
|
:CGDwelling(), IShipyard(this), IMarket(this), town(nullptr), builded(0), destroyed(0), identifier(0), alignment(0xff)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1101,6 +1191,21 @@ bool CGTownInstance::armedGarrison() const
|
|||||||
return stacksCount() || garrisonHero;
|
return stacksCount() || garrisonHero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CTown * CGTownInstance::getTown() const
|
||||||
|
{
|
||||||
|
if(ID == Obj::RANDOM_TOWN)
|
||||||
|
return VLC->townh->randomTown;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(nullptr == town)
|
||||||
|
{
|
||||||
|
return VLC->townh->factions[subID]->town;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return town;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int CGTownInstance::getTownLevel() const
|
int CGTownInstance::getTownLevel() const
|
||||||
{
|
{
|
||||||
// count all buildings that are not upgrades
|
// count all buildings that are not upgrades
|
||||||
@ -1214,34 +1319,100 @@ void CGTownInstance::battleFinished(const CGHeroInstance *hero, const BattleResu
|
|||||||
void CGTownInstance::serializeJsonOptions(JsonSerializeFormat & handler)
|
void CGTownInstance::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
CGObjectInstance::serializeJsonOwner(handler);
|
CGObjectInstance::serializeJsonOwner(handler);
|
||||||
CCreatureSet::serializeJson(handler, "army");
|
CCreatureSet::serializeJson(handler, "army", 7);
|
||||||
handler.serializeBool<ui8>("tightFormation", 1, 0, formation);
|
handler.serializeBool<ui8>("tightFormation", formation, 1, 0, 0);
|
||||||
handler.serializeString("name", name);
|
handler.serializeString("name", name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(!handler.saving)
|
|
||||||
{
|
{
|
||||||
builtBuildings.insert(BuildingID::DEFAULT);//just in case
|
auto decodeBuilding = [this](const std::string & identifier) -> si32
|
||||||
|
{
|
||||||
|
auto rawId = VLC->modh->identifiers.getIdentifier("core", getTown()->getBuildingScope(), identifier);
|
||||||
|
|
||||||
|
if(rawId)
|
||||||
|
return rawId.get();
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto encodeBuilding = [this](si32 index) -> std::string
|
||||||
|
{
|
||||||
|
return getTown()->buildings.at(BuildingID(index))->identifier;
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::set<si32> standard = getTown()->getAllBuildings();//by default all buildings are allowed
|
||||||
|
JsonSerializeFormat::LICSet buildingsLIC(standard, decodeBuilding, encodeBuilding);
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
bool customBuildings = false;
|
||||||
|
|
||||||
|
boost::logic::tribool hasFort(false);
|
||||||
|
|
||||||
|
for(const BuildingID id : forbiddenBuildings)
|
||||||
|
{
|
||||||
|
buildingsLIC.none.insert(id);
|
||||||
|
customBuildings = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(const BuildingID id : builtBuildings)
|
||||||
|
{
|
||||||
|
if(id == BuildingID::DEFAULT)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const CBuilding * building = getTown()->buildings.at(id);
|
||||||
|
|
||||||
|
if(building->mode == CBuilding::BUILD_AUTO)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(id == BuildingID::FORT)
|
||||||
|
hasFort = true;
|
||||||
|
|
||||||
|
buildingsLIC.all.insert(id);
|
||||||
|
customBuildings = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(customBuildings)
|
||||||
|
handler.serializeLIC("buildings", buildingsLIC);
|
||||||
|
else
|
||||||
|
handler.serializeBool("hasFort",hasFort);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handler.serializeLIC("buildings", buildingsLIC);
|
||||||
|
|
||||||
|
builtBuildings.insert(BuildingID::VILLAGE_HALL);
|
||||||
|
|
||||||
|
if(buildingsLIC.none.empty() && buildingsLIC.all.empty())
|
||||||
|
{
|
||||||
|
builtBuildings.insert(BuildingID::DEFAULT);
|
||||||
|
|
||||||
|
bool hasFort = false;
|
||||||
|
handler.serializeBool("hasFort",hasFort);
|
||||||
|
if(hasFort)
|
||||||
|
builtBuildings.insert(BuildingID::FORT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(const si32 item : buildingsLIC.none)
|
||||||
|
forbiddenBuildings.insert(BuildingID(item));
|
||||||
|
for(const si32 item : buildingsLIC.all)
|
||||||
|
builtBuildings.insert(BuildingID(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo: serialize buildings
|
|
||||||
// {
|
|
||||||
// std::vector<bool> standard;
|
|
||||||
// standard.resize(44, true);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// JsonSerializeFormat::LIC buildingsLIC(, CTownHandler::decodeBuilding, CTownHandler::encodeBuilding);
|
|
||||||
// }
|
|
||||||
|
|
||||||
{
|
{
|
||||||
JsonSerializeFormat::LIC spellsLIC(VLC->spellh->getDefaultAllowed(), CSpellHandler::decodeSpell, CSpellHandler::encodeSpell);
|
std::vector<bool> standard = VLC->spellh->getDefaultAllowed();
|
||||||
|
JsonSerializeFormat::LIC spellsLIC(standard, CSpellHandler::decodeSpell, CSpellHandler::encodeSpell);
|
||||||
|
|
||||||
for(SpellID id : possibleSpells)
|
if(handler.saving)
|
||||||
spellsLIC.any[id.num] = true;
|
{
|
||||||
|
for(SpellID id : possibleSpells)
|
||||||
|
spellsLIC.any[id.num] = true;
|
||||||
|
|
||||||
for(SpellID id : obligatorySpells)
|
for(SpellID id : obligatorySpells)
|
||||||
spellsLIC.all[id.num] = true;
|
spellsLIC.all[id.num] = true;
|
||||||
|
}
|
||||||
|
|
||||||
handler.serializeLIC("spells", spellsLIC);
|
handler.serializeLIC("spells", spellsLIC);
|
||||||
|
|
||||||
@ -1251,18 +1422,14 @@ void CGTownInstance::serializeJsonOptions(JsonSerializeFormat & handler)
|
|||||||
for(si32 idx = 0; idx < spellsLIC.any.size(); idx++)
|
for(si32 idx = 0; idx < spellsLIC.any.size(); idx++)
|
||||||
{
|
{
|
||||||
if(spellsLIC.any[idx])
|
if(spellsLIC.any[idx])
|
||||||
{
|
|
||||||
possibleSpells.push_back(SpellID(idx));
|
possibleSpells.push_back(SpellID(idx));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
obligatorySpells.clear();
|
obligatorySpells.clear();
|
||||||
for(si32 idx = 0; idx < spellsLIC.all.size(); idx++)
|
for(si32 idx = 0; idx < spellsLIC.all.size(); idx++)
|
||||||
{
|
{
|
||||||
if(spellsLIC.all[idx])
|
if(spellsLIC.all[idx])
|
||||||
{
|
|
||||||
obligatorySpells.push_back(SpellID(idx));
|
obligatorySpells.push_back(SpellID(idx));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,30 +18,46 @@
|
|||||||
|
|
||||||
class CCastleEvent;
|
class CCastleEvent;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
|
class CGDwelling;
|
||||||
|
|
||||||
class DLL_LINKAGE CSpecObjInfo
|
class DLL_LINKAGE CSpecObjInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~CSpecObjInfo(){};
|
CSpecObjInfo() = default;
|
||||||
PlayerColor player; //owner
|
virtual ~CSpecObjInfo() = default;
|
||||||
|
|
||||||
|
virtual void serializeJson(JsonSerializeFormat & handler) = 0;
|
||||||
|
|
||||||
|
const CGDwelling * owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CCreGenAsCastleInfo : public virtual CSpecObjInfo
|
class DLL_LINKAGE CCreGenAsCastleInfo : public virtual CSpecObjInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
CCreGenAsCastleInfo() = default;
|
||||||
bool asCastle;
|
bool asCastle;
|
||||||
ui32 identifier;
|
ui32 identifier;//h3m internal identifier
|
||||||
ui8 castles[2]; //allowed castles
|
|
||||||
|
std::vector<bool> allowedFactions;
|
||||||
|
|
||||||
|
std::string instanceId;//vcmi map instance identifier
|
||||||
|
void serializeJson(JsonSerializeFormat & handler) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CCreGenLeveledInfo : public virtual CSpecObjInfo
|
class DLL_LINKAGE CCreGenLeveledInfo : public virtual CSpecObjInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ui8 minLevel, maxLevel; //minimal and maximal level of creature in dwelling: <0, 6>
|
CCreGenLeveledInfo() = default;
|
||||||
|
ui8 minLevel, maxLevel; //minimal and maximal level of creature in dwelling: <1, 7>
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CCreGenLeveledCastleInfo : public CCreGenAsCastleInfo, public CCreGenLeveledInfo
|
class DLL_LINKAGE CCreGenLeveledCastleInfo : public CCreGenAsCastleInfo, public CCreGenLeveledInfo
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
CCreGenLeveledCastleInfo() = default;
|
||||||
|
void serializeJson(JsonSerializeFormat & handler) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CGDwelling : public CArmedInstance
|
class DLL_LINKAGE CGDwelling : public CArmedInstance
|
||||||
@ -49,9 +65,13 @@ class DLL_LINKAGE CGDwelling : public CArmedInstance
|
|||||||
public:
|
public:
|
||||||
typedef std::vector<std::pair<ui32, std::vector<CreatureID> > > TCreaturesSet;
|
typedef std::vector<std::pair<ui32, std::vector<CreatureID> > > TCreaturesSet;
|
||||||
|
|
||||||
CSpecObjInfo * info; //h3m info about dewlling
|
CSpecObjInfo * info; //random dwelling options; not serialized
|
||||||
TCreaturesSet creatures; //creatures[level] -> <vector of alternative ids (base creature and upgrades, creatures amount>
|
TCreaturesSet creatures; //creatures[level] -> <vector of alternative ids (base creature and upgrades, creatures amount>
|
||||||
|
|
||||||
|
CGDwelling();
|
||||||
|
virtual ~CGDwelling();
|
||||||
|
|
||||||
|
void initRandomObjectInfo();
|
||||||
protected:
|
protected:
|
||||||
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
||||||
|
|
||||||
@ -245,6 +265,8 @@ public:
|
|||||||
void clearArmy() const;
|
void clearArmy() const;
|
||||||
void addHeroToStructureVisitors(const CGHeroInstance *h, si32 structureInstanceID) const; //hero must be visiting or garrisoned in town
|
void addHeroToStructureVisitors(const CGHeroInstance *h, si32 structureInstanceID) const; //hero must be visiting or garrisoned in town
|
||||||
|
|
||||||
|
const CTown * getTown() const ;
|
||||||
|
|
||||||
CGTownInstance();
|
CGTownInstance();
|
||||||
virtual ~CGTownInstance();
|
virtual ~CGTownInstance();
|
||||||
|
|
||||||
|
@ -242,6 +242,8 @@ public:
|
|||||||
/// Returns handler string describing the handler (for use in client)
|
/// Returns handler string describing the handler (for use in client)
|
||||||
std::string getObjectHandlerName(si32 type) const;
|
std::string getObjectHandlerName(si32 type) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & objects;
|
h & objects;
|
||||||
|
@ -328,9 +328,9 @@ void CGObjectInstance::serializeJson(JsonSerializeFormat & handler)
|
|||||||
handler.serializeString("type", typeName);
|
handler.serializeString("type", typeName);
|
||||||
handler.serializeString("subtype", subTypeName);
|
handler.serializeString("subtype", subTypeName);
|
||||||
|
|
||||||
handler.serializeNumeric("x", pos.x);
|
handler.serializeInt("x", pos.x);
|
||||||
handler.serializeNumeric("y", pos.y);
|
handler.serializeInt("y", pos.y);
|
||||||
handler.serializeNumeric("l", pos.z);
|
handler.serializeInt("l", pos.z);
|
||||||
appearance.writeJson(handler.getCurrent()["template"], false);
|
appearance.writeJson(handler.getCurrent()["template"], false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,32 +352,12 @@ void CGObjectInstance::serializeJsonOptions(JsonSerializeFormat & handler)
|
|||||||
|
|
||||||
void CGObjectInstance::serializeJsonOwner(JsonSerializeFormat & handler)
|
void CGObjectInstance::serializeJsonOwner(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
std::string temp;
|
ui8 temp = tempOwner.getNum();
|
||||||
|
|
||||||
//todo: use enum serialize
|
handler.serializeEnum("owner", temp, PlayerColor::NEUTRAL.getNum(), GameConstants::PLAYER_COLOR_NAMES);
|
||||||
if(handler.saving)
|
|
||||||
{
|
|
||||||
if(tempOwner.isValidPlayer())
|
|
||||||
{
|
|
||||||
temp = GameConstants::PLAYER_COLOR_NAMES[tempOwner.getNum()];
|
|
||||||
handler.serializeString("owner", temp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tempOwner = PlayerColor::NEUTRAL;//this method assumes that object is ownable
|
|
||||||
|
|
||||||
handler.serializeString("owner", temp);
|
if(!handler.saving)
|
||||||
|
tempOwner = PlayerColor(temp);
|
||||||
if(temp != "")
|
|
||||||
{
|
|
||||||
auto rawOwner = vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, temp);
|
|
||||||
if(rawOwner >=0)
|
|
||||||
tempOwner = PlayerColor(rawOwner);
|
|
||||||
else
|
|
||||||
logGlobal->errorStream() << "Invalid owner :" << temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CGObjectInstanceBySubIdFinder::CGObjectInstanceBySubIdFinder(CGObjectInstance * obj) : obj(obj)
|
CGObjectInstanceBySubIdFinder::CGObjectInstanceBySubIdFinder(CGObjectInstance * obj) : obj(obj)
|
||||||
|
@ -20,6 +20,12 @@
|
|||||||
#include "MiscObjects.h"
|
#include "MiscObjects.h"
|
||||||
#include "../IGameCallback.h"
|
#include "../IGameCallback.h"
|
||||||
#include "../CGameState.h"
|
#include "../CGameState.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
#include "../CModHandler.h"
|
||||||
|
#include "../GameConstants.h"
|
||||||
|
#include "../StringConstants.h"
|
||||||
|
#include "../spells/CSpellHandler.h"
|
||||||
|
|
||||||
|
|
||||||
std::map <PlayerColor, std::set <ui8> > CGKeys::playerKeyMap;
|
std::map <PlayerColor, std::set <ui8> > CGKeys::playerKeyMap;
|
||||||
|
|
||||||
@ -395,6 +401,86 @@ void CQuest::getCompletionText(MetaString &iwText, std::vector<Component> &compo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CQuest::serializeJson(JsonSerializeFormat & handler, const std::string & fieldName)
|
||||||
|
{
|
||||||
|
auto q = handler.enterStruct(fieldName);
|
||||||
|
|
||||||
|
handler.serializeString("firstVisitText", firstVisitText);
|
||||||
|
handler.serializeString("nextVisitText", nextVisitText);
|
||||||
|
handler.serializeString("completedText", completedText);
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
{
|
||||||
|
isCustomFirst = firstVisitText.size() > 0;
|
||||||
|
isCustomNext = nextVisitText.size() > 0;
|
||||||
|
isCustomComplete = completedText.size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const std::vector<std::string> MISSION_TYPE_JSON =
|
||||||
|
{
|
||||||
|
"None", "Level", "PrimaryStat", "KillHero", "KillCreature", "Artifact", "Army", "Resources", "Hero", "Player"
|
||||||
|
};
|
||||||
|
|
||||||
|
handler.serializeEnum("missionType", missionType, Emission::MISSION_NONE, MISSION_TYPE_JSON);
|
||||||
|
handler.serializeInt("timeLimit", lastDay, -1);
|
||||||
|
|
||||||
|
switch (missionType)
|
||||||
|
{
|
||||||
|
case MISSION_NONE:
|
||||||
|
break;
|
||||||
|
case MISSION_LEVEL:
|
||||||
|
handler.serializeInt("heroLevel", m13489val, -1);
|
||||||
|
break;
|
||||||
|
case MISSION_PRIMARY_STAT:
|
||||||
|
{
|
||||||
|
auto primarySkills = handler.enterStruct("primarySkills");
|
||||||
|
if(!handler.saving)
|
||||||
|
m2stats.resize(GameConstants::PRIMARY_SKILLS);
|
||||||
|
|
||||||
|
for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
|
||||||
|
handler.serializeInt(PrimarySkill::names[i], m2stats[i], 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MISSION_KILL_HERO:
|
||||||
|
case MISSION_KILL_CREATURE:
|
||||||
|
handler.serializeInstance<ui32>("killTarget", m13489val, ui32(-1));
|
||||||
|
break;
|
||||||
|
case MISSION_ART:
|
||||||
|
//todo: ban artifacts
|
||||||
|
handler.serializeIdArray("artifacts", m5arts, &CArtHandler::decodeArfifact, &CArtHandler::encodeArtifact);
|
||||||
|
break;
|
||||||
|
case MISSION_ARMY:
|
||||||
|
{
|
||||||
|
auto a = handler.enterArray("creatures");
|
||||||
|
a.serializeStruct(m6creatures);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MISSION_RESOURCES:
|
||||||
|
{
|
||||||
|
auto r = handler.enterStruct("resources");
|
||||||
|
|
||||||
|
if(!handler.saving)
|
||||||
|
m7resources.resize(GameConstants::RESOURCE_QUANTITY-1);
|
||||||
|
|
||||||
|
for(size_t idx = 0; idx < (GameConstants::RESOURCE_QUANTITY - 1); idx++)
|
||||||
|
{
|
||||||
|
handler.serializeInt(GameConstants::RESOURCE_NAMES[idx], m7resources[idx], 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MISSION_HERO:
|
||||||
|
handler.serializeId<ui32>("hero", m13489val, 0, &CHeroHandler::decodeHero, &CHeroHandler::encodeHero);
|
||||||
|
break;
|
||||||
|
case MISSION_PLAYER:
|
||||||
|
handler.serializeEnum("player", m13489val, PlayerColor::CANNOT_DETERMINE.getNum(), GameConstants::PLAYER_COLOR_NAMES);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logGlobal->error("Invalid quest mission type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
CGSeerHut::CGSeerHut() : IQuestObject(),
|
CGSeerHut::CGSeerHut() : IQuestObject(),
|
||||||
rewardType(NOTHING), rID(-1), rVal(-1)
|
rewardType(NOTHING), rID(-1), rVal(-1)
|
||||||
{
|
{
|
||||||
@ -763,6 +849,165 @@ void CGSeerHut::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer)
|
|||||||
finishQuest(hero, answer);
|
finishQuest(hero, answer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGSeerHut::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
static const std::map<ERewardType, std::string> REWARD_MAP =
|
||||||
|
{
|
||||||
|
{NOTHING, ""},
|
||||||
|
{EXPERIENCE, "experience"},
|
||||||
|
{MANA_POINTS, "mana"},
|
||||||
|
{MORALE_BONUS, "morale"},
|
||||||
|
{LUCK_BONUS, "luck"},
|
||||||
|
{RESOURCES, "resource"},
|
||||||
|
{PRIMARY_SKILL, "primarySkill"},
|
||||||
|
{SECONDARY_SKILL,"secondarySkill"},
|
||||||
|
{ARTIFACT, "artifact"},
|
||||||
|
{SPELL, "spell"},
|
||||||
|
{CREATURE, "creature"}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::map<std::string, ERewardType> REWARD_RMAP =
|
||||||
|
{
|
||||||
|
{"experience", EXPERIENCE},
|
||||||
|
{"mana", MANA_POINTS},
|
||||||
|
{"morale", MORALE_BONUS},
|
||||||
|
{"luck", LUCK_BONUS},
|
||||||
|
{"resource", RESOURCES},
|
||||||
|
{"primarySkill", PRIMARY_SKILL},
|
||||||
|
{"secondarySkill",SECONDARY_SKILL},
|
||||||
|
{"artifact", ARTIFACT},
|
||||||
|
{"spell", SPELL},
|
||||||
|
{"creature", CREATURE}
|
||||||
|
};
|
||||||
|
|
||||||
|
//quest and reward
|
||||||
|
quest->serializeJson(handler, "quest");
|
||||||
|
|
||||||
|
//only one reward is supported
|
||||||
|
//todo: full reward format support after CRewardInfo integration
|
||||||
|
|
||||||
|
auto s = handler.enterStruct("reward");
|
||||||
|
std::string fullIdentifier, metaTypeName, scope, identifier;
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
si32 amount = rVal;
|
||||||
|
|
||||||
|
metaTypeName = REWARD_MAP.at(rewardType);
|
||||||
|
switch (rewardType)
|
||||||
|
{
|
||||||
|
case NOTHING:
|
||||||
|
break;
|
||||||
|
case EXPERIENCE:
|
||||||
|
case MANA_POINTS:
|
||||||
|
case MORALE_BONUS:
|
||||||
|
case LUCK_BONUS:
|
||||||
|
identifier = "";
|
||||||
|
break;
|
||||||
|
case RESOURCES:
|
||||||
|
identifier = GameConstants::RESOURCE_NAMES[rID];
|
||||||
|
break;
|
||||||
|
case PRIMARY_SKILL:
|
||||||
|
identifier = PrimarySkill::names[rID];
|
||||||
|
break;
|
||||||
|
case SECONDARY_SKILL:
|
||||||
|
identifier = NSecondarySkill::names[rID];
|
||||||
|
break;
|
||||||
|
case ARTIFACT:
|
||||||
|
identifier = ArtifactID(rID).toArtifact()->identifier;
|
||||||
|
amount = 1;
|
||||||
|
break;
|
||||||
|
case SPELL:
|
||||||
|
identifier = SpellID(rID).toSpell()->identifier;
|
||||||
|
amount = 1;
|
||||||
|
break;
|
||||||
|
case CREATURE:
|
||||||
|
identifier = CreatureID(rID).toCreature()->identifier;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(rewardType != NOTHING)
|
||||||
|
{
|
||||||
|
fullIdentifier = CModHandler::makeFullIdentifier(scope, metaTypeName, identifier);
|
||||||
|
handler.serializeInt(fullIdentifier, amount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rewardType = NOTHING;
|
||||||
|
|
||||||
|
const JsonNode & rewardsJson = handler.getCurrent();
|
||||||
|
|
||||||
|
fullIdentifier = "";
|
||||||
|
|
||||||
|
if(rewardsJson.Struct().empty())
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto iter = rewardsJson.Struct().begin();
|
||||||
|
fullIdentifier = iter->first;
|
||||||
|
}
|
||||||
|
|
||||||
|
CModHandler::parseIdentifier(fullIdentifier, scope, metaTypeName, identifier);
|
||||||
|
|
||||||
|
auto it = REWARD_RMAP.find(metaTypeName);
|
||||||
|
|
||||||
|
if(it == REWARD_RMAP.end())
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << instanceName << ": invalid metatype in reward item " << fullIdentifier;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rewardType = it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool doRequest = false;
|
||||||
|
|
||||||
|
switch (rewardType)
|
||||||
|
{
|
||||||
|
case NOTHING:
|
||||||
|
return;
|
||||||
|
case EXPERIENCE:
|
||||||
|
case MANA_POINTS:
|
||||||
|
case MORALE_BONUS:
|
||||||
|
case LUCK_BONUS:
|
||||||
|
break;
|
||||||
|
case PRIMARY_SKILL:
|
||||||
|
doRequest = true;
|
||||||
|
break;
|
||||||
|
case RESOURCES:
|
||||||
|
case SECONDARY_SKILL:
|
||||||
|
case ARTIFACT:
|
||||||
|
case SPELL:
|
||||||
|
case CREATURE:
|
||||||
|
doRequest = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doRequest)
|
||||||
|
{
|
||||||
|
auto rawId = VLC->modh->identifiers.getIdentifier("core", fullIdentifier, false);
|
||||||
|
|
||||||
|
if(rawId)
|
||||||
|
{
|
||||||
|
rID = rawId.get();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rewardType = NOTHING;//fallback in case of error
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handler.serializeInt(fullIdentifier, rVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CGQuestGuard::init(CRandomGenerator & rand)
|
void CGQuestGuard::init(CRandomGenerator & rand)
|
||||||
{
|
{
|
||||||
blockVisit = true;
|
blockVisit = true;
|
||||||
@ -775,6 +1020,12 @@ void CGQuestGuard::completeQuest(const CGHeroInstance *h) const
|
|||||||
cb->removeObject(this);
|
cb->removeObject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGQuestGuard::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
//quest only, do not call base class
|
||||||
|
quest->serializeJson(handler, "quest");
|
||||||
|
}
|
||||||
|
|
||||||
void CGKeys::reset()
|
void CGKeys::reset()
|
||||||
{
|
{
|
||||||
playerKeyMap.clear();
|
playerKeyMap.clear();
|
||||||
|
@ -80,6 +80,8 @@ public:
|
|||||||
completedOption = 1;
|
completedOption = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName);
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE IQuestObject
|
class DLL_LINKAGE IQuestObject
|
||||||
@ -133,6 +135,8 @@ protected:
|
|||||||
static const int OBJPROP_VISITED = 10;
|
static const int OBJPROP_VISITED = 10;
|
||||||
|
|
||||||
void setPropertyDer(ui8 what, ui32 val) override;
|
void setPropertyDer(ui8 what, ui32 val) override;
|
||||||
|
|
||||||
|
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CGQuestGuard : public CGSeerHut
|
class DLL_LINKAGE CGQuestGuard : public CGSeerHut
|
||||||
@ -146,6 +150,8 @@ public:
|
|||||||
{
|
{
|
||||||
h & static_cast<CGSeerHut&>(*this);
|
h & static_cast<CGSeerHut&>(*this);
|
||||||
}
|
}
|
||||||
|
protected:
|
||||||
|
void serializeJsonOptions(JsonSerializeFormat & handler) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CGKeys : public CGObjectInstance //Base class for Keymaster and guards
|
class DLL_LINKAGE CGKeys : public CGObjectInstance //Base class for Keymaster and guards
|
||||||
|
@ -21,7 +21,7 @@ namespace {
|
|||||||
MetaString loadMessage(const JsonNode & value)
|
MetaString loadMessage(const JsonNode & value)
|
||||||
{
|
{
|
||||||
MetaString ret;
|
MetaString ret;
|
||||||
if (value.getType() == JsonNode::DATA_FLOAT)
|
if (value.isNumber())
|
||||||
ret.addTxt(MetaString::ADVOB_TXT, value.Float());
|
ret.addTxt(MetaString::ADVOB_TXT, value.Float());
|
||||||
else
|
else
|
||||||
ret << value.String();
|
ret << value.String();
|
||||||
|
@ -28,7 +28,7 @@ namespace JsonRandom
|
|||||||
{
|
{
|
||||||
if (value.isNull())
|
if (value.isNull())
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
if (value.getType() == JsonNode::DATA_FLOAT)
|
if (value.isNumber())
|
||||||
return value.Float();
|
return value.Float();
|
||||||
if (!value["amount"].isNull())
|
if (!value["amount"].isNull())
|
||||||
return value["amount"].Float();
|
return value["amount"].Float();
|
||||||
|
@ -600,50 +600,30 @@ static const std::vector<std::string> CHARACTER_JSON =
|
|||||||
|
|
||||||
void CGCreature::serializeJsonOptions(JsonSerializeFormat & handler)
|
void CGCreature::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
handler.serializeNumericEnum("character", CHARACTER_JSON, (si8)0, character);
|
handler.serializeEnum("character", character, CHARACTER_JSON);
|
||||||
|
|
||||||
if(handler.saving)
|
if(handler.saving)
|
||||||
{
|
{
|
||||||
if(hasStackAtSlot(SlotID(0)))
|
if(hasStackAtSlot(SlotID(0)))
|
||||||
{
|
{
|
||||||
si32 amount = getStack(SlotID(0)).count;
|
si32 amount = getStack(SlotID(0)).count;
|
||||||
handler.serializeNumeric("amount", amount);
|
handler.serializeInt("amount", amount, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resources.nonZero())
|
|
||||||
{
|
|
||||||
for(size_t idx = 0; idx < resources.size(); idx++)
|
|
||||||
handler.getCurrent()["rewardResources"][GameConstants::RESOURCE_NAMES[idx]].Float() = resources[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
auto tmp = (gainedArtifact == ArtifactID(ArtifactID::NONE) ? "" : gainedArtifact.toArtifact()->identifier);
|
|
||||||
handler.serializeString("rewardArtifact", tmp);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
si32 amount = 0;
|
si32 amount = 0;
|
||||||
handler.serializeNumeric("amount", amount);
|
handler.serializeInt("amount", amount);
|
||||||
auto hlp = new CStackInstance();
|
auto hlp = new CStackInstance();
|
||||||
hlp->count = amount;
|
hlp->count = amount;
|
||||||
//type will be set during initialization
|
//type will be set during initialization
|
||||||
putStack(SlotID(0), hlp);
|
putStack(SlotID(0), hlp);
|
||||||
{
|
|
||||||
TResources tmp(handler.getCurrent()["rewardResources"]);
|
|
||||||
std::swap(tmp,resources);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
gainedArtifact = ArtifactID(ArtifactID::NONE);
|
|
||||||
std::string tmp;
|
|
||||||
handler.serializeString("rewardArtifact", tmp);
|
|
||||||
|
|
||||||
if(tmp != "")
|
|
||||||
{
|
|
||||||
auto artid = VLC->modh->identifiers.getIdentifier("core", "artifact", tmp);
|
|
||||||
if(artid)
|
|
||||||
gainedArtifact = ArtifactID(artid.get());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resources.serializeJson(handler, "rewardResources");
|
||||||
|
|
||||||
|
handler.serializeId("rewardArtifact", gainedArtifact, ArtifactID(ArtifactID::NONE), &CArtHandler::decodeArfifact, &CArtHandler::encodeArtifact);
|
||||||
|
|
||||||
handler.serializeBool("noGrowing", notGrowingTeam);
|
handler.serializeBool("noGrowing", notGrowingTeam);
|
||||||
handler.serializeBool("neverFlees", neverFlees);
|
handler.serializeBool("neverFlees", neverFlees);
|
||||||
handler.serializeString("rewardMessage", message);
|
handler.serializeString("rewardMessage", message);
|
||||||
@ -793,7 +773,7 @@ void CGMine::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) con
|
|||||||
|
|
||||||
void CGMine::serializeJsonOptions(JsonSerializeFormat & handler)
|
void CGMine::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
CCreatureSet::serializeJson(handler, "army");
|
CCreatureSet::serializeJson(handler, "army", 7);
|
||||||
|
|
||||||
if(isAbandoned())
|
if(isAbandoned())
|
||||||
{
|
{
|
||||||
@ -934,8 +914,8 @@ void CGResource::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer)
|
|||||||
|
|
||||||
void CGResource::serializeJsonOptions(JsonSerializeFormat & handler)
|
void CGResource::serializeJsonOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
CCreatureSet::serializeJson(handler, "guards");
|
CCreatureSet::serializeJson(handler, "guards", 7);
|
||||||
handler.serializeNumeric("amount", amount);
|
handler.serializeInt("amount", amount, 0);
|
||||||
handler.serializeString("guardMessage", message);
|
handler.serializeString("guardMessage", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1428,15 +1408,14 @@ void CGArtifact::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer)
|
|||||||
void CGArtifact::serializeJsonOptions(JsonSerializeFormat& handler)
|
void CGArtifact::serializeJsonOptions(JsonSerializeFormat& handler)
|
||||||
{
|
{
|
||||||
handler.serializeString("guardMessage", message);
|
handler.serializeString("guardMessage", message);
|
||||||
CCreatureSet::serializeJson(handler, "guards");
|
CCreatureSet::serializeJson(handler, "guards" ,7);
|
||||||
|
|
||||||
if(handler.saving && ID == Obj::SPELL_SCROLL)
|
if(handler.saving && ID == Obj::SPELL_SCROLL)
|
||||||
{
|
{
|
||||||
const std::shared_ptr<Bonus> b = storedArtifact->getBonusLocalFirst(Selector::type(Bonus::SPELL));
|
const std::shared_ptr<Bonus> b = storedArtifact->getBonusLocalFirst(Selector::type(Bonus::SPELL));
|
||||||
SpellID spellId(b->subtype);
|
SpellID spellId(b->subtype);
|
||||||
|
|
||||||
std::string spell = SpellID(b->subtype).toSpell()->identifier;
|
handler.serializeId("spell", spellId, SpellID::NONE, &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell);
|
||||||
handler.serializeString("spell", spell);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1665,7 +1644,7 @@ std::string CGShrine::getHoverText(const CGHeroInstance * hero) const
|
|||||||
|
|
||||||
void CGShrine::serializeJsonOptions(JsonSerializeFormat& handler)
|
void CGShrine::serializeJsonOptions(JsonSerializeFormat& handler)
|
||||||
{
|
{
|
||||||
handler.serializeId("spell", &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell, SpellID(SpellID::NONE), spell);
|
handler.serializeId("spell", spell, SpellID::NONE, &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGSignBottle::initObj(CRandomGenerator & rand)
|
void CGSignBottle::initObj(CRandomGenerator & rand)
|
||||||
@ -1861,7 +1840,7 @@ void CGGarrison::serializeJsonOptions(JsonSerializeFormat& handler)
|
|||||||
{
|
{
|
||||||
handler.serializeBool("removableUnits", removableUnits);
|
handler.serializeBool("removableUnits", removableUnits);
|
||||||
serializeJsonOwner(handler);
|
serializeJsonOwner(handler);
|
||||||
CCreatureSet::serializeJson(handler, "army");
|
CCreatureSet::serializeJson(handler, "army", 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGMagi::reset()
|
void CGMagi::reset()
|
||||||
|
@ -64,7 +64,8 @@ ObjectTemplate::ObjectTemplate(const ObjectTemplate& other):
|
|||||||
id(other.id),
|
id(other.id),
|
||||||
subid(other.subid),
|
subid(other.subid),
|
||||||
printPriority(other.printPriority),
|
printPriority(other.printPriority),
|
||||||
animationFile(other.animationFile)
|
animationFile(other.animationFile),
|
||||||
|
editorAnimationFile(other.editorAnimationFile)
|
||||||
{
|
{
|
||||||
//default copy constructor is failing with usedTiles this for unknown reason
|
//default copy constructor is failing with usedTiles this for unknown reason
|
||||||
|
|
||||||
@ -81,6 +82,7 @@ ObjectTemplate & ObjectTemplate::operator=(const ObjectTemplate & rhs)
|
|||||||
subid = rhs.subid;
|
subid = rhs.subid;
|
||||||
printPriority = rhs.printPriority;
|
printPriority = rhs.printPriority;
|
||||||
animationFile = rhs.animationFile;
|
animationFile = rhs.animationFile;
|
||||||
|
editorAnimationFile = rhs.editorAnimationFile;
|
||||||
|
|
||||||
usedTiles.clear();
|
usedTiles.clear();
|
||||||
usedTiles.resize(rhs.usedTiles.size());
|
usedTiles.resize(rhs.usedTiles.size());
|
||||||
@ -89,6 +91,16 @@ ObjectTemplate & ObjectTemplate::operator=(const ObjectTemplate & rhs)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectTemplate::afterLoadFixup()
|
||||||
|
{
|
||||||
|
if(id == Obj::EVENT)
|
||||||
|
{
|
||||||
|
setSize(1,1);
|
||||||
|
usedTiles[0][0] = VISITABLE;
|
||||||
|
visitDir = 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectTemplate::readTxt(CLegacyConfigParser & parser)
|
void ObjectTemplate::readTxt(CLegacyConfigParser & parser)
|
||||||
{
|
{
|
||||||
std::string data = parser.readString();
|
std::string data = parser.readString();
|
||||||
@ -207,16 +219,13 @@ void ObjectTemplate::readMap(CBinaryReader & reader)
|
|||||||
reader.skip(16);
|
reader.skip(16);
|
||||||
readMsk();
|
readMsk();
|
||||||
|
|
||||||
if (id == Obj::EVENT)
|
afterLoadFixup();
|
||||||
{
|
|
||||||
setSize(1,1);
|
|
||||||
usedTiles[0][0] = VISITABLE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectTemplate::readJson(const JsonNode &node, const bool withTerrain)
|
void ObjectTemplate::readJson(const JsonNode &node, const bool withTerrain)
|
||||||
{
|
{
|
||||||
animationFile = node["animation"].String();
|
animationFile = node["animation"].String();
|
||||||
|
editorAnimationFile = node["editorAnimation"].String();
|
||||||
|
|
||||||
const JsonVector & visitDirs = node["visitableFrom"].Vector();
|
const JsonVector & visitDirs = node["visitableFrom"].Vector();
|
||||||
if (!visitDirs.empty())
|
if (!visitDirs.empty())
|
||||||
@ -284,11 +293,14 @@ void ObjectTemplate::readJson(const JsonNode &node, const bool withTerrain)
|
|||||||
}
|
}
|
||||||
|
|
||||||
printPriority = node["zIndex"].Float();
|
printPriority = node["zIndex"].Float();
|
||||||
|
|
||||||
|
afterLoadFixup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectTemplate::writeJson(JsonNode & node, const bool withTerrain) const
|
void ObjectTemplate::writeJson(JsonNode & node, const bool withTerrain) const
|
||||||
{
|
{
|
||||||
node["animation"].String() = animationFile;
|
node["animation"].String() = animationFile;
|
||||||
|
node["editorAnimation"].String() = editorAnimationFile;
|
||||||
|
|
||||||
if(visitDir != 0x0 && isVisitable())
|
if(visitDir != 0x0 && isVisitable())
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,8 @@ class DLL_LINKAGE ObjectTemplate
|
|||||||
/// list of terrains on which this object can be placed
|
/// list of terrains on which this object can be placed
|
||||||
std::set<ETerrainType> allowedTerrains;
|
std::set<ETerrainType> allowedTerrains;
|
||||||
|
|
||||||
|
void afterLoadFixup();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// H3 ID/subID of this object
|
/// H3 ID/subID of this object
|
||||||
Obj id;
|
Obj id;
|
||||||
@ -42,6 +44,9 @@ public:
|
|||||||
/// animation file that should be used to display object
|
/// animation file that should be used to display object
|
||||||
std::string animationFile;
|
std::string animationFile;
|
||||||
|
|
||||||
|
/// map editor only animation file
|
||||||
|
std::string editorAnimationFile;
|
||||||
|
|
||||||
/// string ID, equals to def base name for h3m files (lower case, no extension) or specified in mod data
|
/// string ID, equals to def base name for h3m files (lower case, no extension) or specified in mod data
|
||||||
std::string stringID;
|
std::string stringID;
|
||||||
|
|
||||||
@ -86,6 +91,10 @@ public:
|
|||||||
{
|
{
|
||||||
h & usedTiles & allowedTerrains & animationFile & stringID;
|
h & usedTiles & allowedTerrains & animationFile & stringID;
|
||||||
h & id & subid & printPriority & visitDir;
|
h & id & subid & printPriority & visitDir;
|
||||||
|
if(version >= 770)
|
||||||
|
{
|
||||||
|
h & editorAnimationFile;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "../CGeneralTextHandler.h"
|
#include "../CGeneralTextHandler.h"
|
||||||
#include "../spells/CSpellHandler.h"
|
#include "../spells/CSpellHandler.h"
|
||||||
#include "CMapEditManager.h"
|
#include "CMapEditManager.h"
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
SHeroName::SHeroName() : heroId(-1)
|
SHeroName::SHeroName() : heroId(-1)
|
||||||
{
|
{
|
||||||
@ -18,8 +19,8 @@ SHeroName::SHeroName() : heroId(-1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PlayerInfo::PlayerInfo(): canHumanPlay(false), canComputerPlay(false),
|
PlayerInfo::PlayerInfo(): canHumanPlay(false), canComputerPlay(false),
|
||||||
aiTactic(EAiTactic::RANDOM), isFactionRandom(false), mainCustomHeroPortrait(-1), mainCustomHeroId(-1), hasMainTown(false),
|
aiTactic(EAiTactic::RANDOM), isFactionRandom(false), hasRandomHero(false), mainCustomHeroPortrait(-1), mainCustomHeroId(-1), hasMainTown(false),
|
||||||
generateHeroAtMainTown(false), team(TeamID::NO_TEAM), hasRandomHero(false), /* following are unused */ generateHero(false), p7(0), powerPlaceholders(-1)
|
generateHeroAtMainTown(false), team(TeamID::NO_TEAM), /* following are unused */ generateHero(false), p7(0), powerPlaceholders(-1)
|
||||||
{
|
{
|
||||||
allowedFactions = VLC->townh->getAllowedFactions();
|
allowedFactions = VLC->townh->getAllowedFactions();
|
||||||
}
|
}
|
||||||
@ -61,6 +62,7 @@ bool PlayerInfo::hasCustomMainHero() const
|
|||||||
|
|
||||||
EventCondition::EventCondition(EWinLoseType condition):
|
EventCondition::EventCondition(EWinLoseType condition):
|
||||||
object(nullptr),
|
object(nullptr),
|
||||||
|
metaType(EMetaclass::INVALID),
|
||||||
value(-1),
|
value(-1),
|
||||||
objectType(-1),
|
objectType(-1),
|
||||||
objectSubtype(-1),
|
objectSubtype(-1),
|
||||||
@ -71,6 +73,7 @@ EventCondition::EventCondition(EWinLoseType condition):
|
|||||||
|
|
||||||
EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position):
|
EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position):
|
||||||
object(nullptr),
|
object(nullptr),
|
||||||
|
metaType(EMetaclass::INVALID),
|
||||||
value(value),
|
value(value),
|
||||||
objectType(objectType),
|
objectType(objectType),
|
||||||
objectSubtype(-1),
|
objectSubtype(-1),
|
||||||
@ -78,6 +81,12 @@ EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectTy
|
|||||||
condition(condition)
|
condition(condition)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void Rumor::serializeJson(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
handler.serializeString("name", name);
|
||||||
|
handler.serializeString("text", text);
|
||||||
|
}
|
||||||
|
|
||||||
DisposedHero::DisposedHero() : heroId(0), portrait(255), players(0)
|
DisposedHero::DisposedHero() : heroId(0), portrait(255), players(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -503,22 +512,26 @@ void CMap::checkForObjectives()
|
|||||||
{
|
{
|
||||||
switch (cond.condition)
|
switch (cond.condition)
|
||||||
{
|
{
|
||||||
break; case EventCondition::HAVE_ARTIFACT:
|
case EventCondition::HAVE_ARTIFACT:
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%s", VLC->arth->artifacts[cond.objectType]->Name());
|
boost::algorithm::replace_first(event.onFulfill, "%s", VLC->arth->artifacts[cond.objectType]->Name());
|
||||||
|
break;
|
||||||
|
|
||||||
break; case EventCondition::HAVE_CREATURES:
|
case EventCondition::HAVE_CREATURES:
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%s", VLC->creh->creatures[cond.objectType]->nameSing);
|
boost::algorithm::replace_first(event.onFulfill, "%s", VLC->creh->creatures[cond.objectType]->nameSing);
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%d", boost::lexical_cast<std::string>(cond.value));
|
boost::algorithm::replace_first(event.onFulfill, "%d", boost::lexical_cast<std::string>(cond.value));
|
||||||
|
break;
|
||||||
|
|
||||||
break; case EventCondition::HAVE_RESOURCES:
|
case EventCondition::HAVE_RESOURCES:
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%s", VLC->generaltexth->restypes[cond.objectType]);
|
boost::algorithm::replace_first(event.onFulfill, "%s", VLC->generaltexth->restypes[cond.objectType]);
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%d", boost::lexical_cast<std::string>(cond.value));
|
boost::algorithm::replace_first(event.onFulfill, "%d", boost::lexical_cast<std::string>(cond.value));
|
||||||
|
break;
|
||||||
|
|
||||||
break; case EventCondition::HAVE_BUILDING:
|
case EventCondition::HAVE_BUILDING:
|
||||||
if (isInTheMap(cond.position))
|
if (isInTheMap(cond.position))
|
||||||
cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN);
|
cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN);
|
||||||
|
break;
|
||||||
|
|
||||||
break; case EventCondition::CONTROL:
|
case EventCondition::CONTROL:
|
||||||
if (isInTheMap(cond.position))
|
if (isInTheMap(cond.position))
|
||||||
cond.object = getObjectiveObjectFrom(cond.position, Obj::EObj(cond.objectType));
|
cond.object = getObjectiveObjectFrom(cond.position, Obj::EObj(cond.objectType));
|
||||||
|
|
||||||
@ -531,8 +544,9 @@ void CMap::checkForObjectives()
|
|||||||
if (hero)
|
if (hero)
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%s", hero->name);
|
boost::algorithm::replace_first(event.onFulfill, "%s", hero->name);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
break; case EventCondition::DESTROY:
|
case EventCondition::DESTROY:
|
||||||
if (isInTheMap(cond.position))
|
if (isInTheMap(cond.position))
|
||||||
cond.object = getObjectiveObjectFrom(cond.position, Obj::EObj(cond.objectType));
|
cond.object = getObjectiveObjectFrom(cond.position, Obj::EObj(cond.objectType));
|
||||||
|
|
||||||
@ -542,12 +556,22 @@ void CMap::checkForObjectives()
|
|||||||
if (hero)
|
if (hero)
|
||||||
boost::algorithm::replace_first(event.onFulfill, "%s", hero->name);
|
boost::algorithm::replace_first(event.onFulfill, "%s", hero->name);
|
||||||
}
|
}
|
||||||
break; case EventCondition::TRANSPORT:
|
break;
|
||||||
|
case EventCondition::TRANSPORT:
|
||||||
cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN);
|
cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN);
|
||||||
|
break;
|
||||||
//break; case EventCondition::DAYS_PASSED:
|
//break; case EventCondition::DAYS_PASSED:
|
||||||
//break; case EventCondition::IS_HUMAN:
|
//break; case EventCondition::IS_HUMAN:
|
||||||
//break; case EventCondition::DAYS_WITHOUT_TOWN:
|
//break; case EventCondition::DAYS_WITHOUT_TOWN:
|
||||||
//break; case EventCondition::STANDARD_WIN:
|
//break; case EventCondition::STANDARD_WIN:
|
||||||
|
|
||||||
|
//TODO: support new condition format
|
||||||
|
case EventCondition::HAVE_0:
|
||||||
|
break;
|
||||||
|
case EventCondition::DESTROY_0:
|
||||||
|
break;
|
||||||
|
case EventCondition::HAVE_BUILDING_0:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return cond;
|
return cond;
|
||||||
};
|
};
|
||||||
|
@ -68,16 +68,22 @@ struct DLL_LINKAGE PlayerInfo
|
|||||||
std::set<TFaction> allowedFactions;
|
std::set<TFaction> allowedFactions;
|
||||||
bool isFactionRandom;
|
bool isFactionRandom;
|
||||||
|
|
||||||
si32 mainCustomHeroPortrait; /// The default value is -1.
|
///main hero instance (VCMI maps only)
|
||||||
|
std::string mainHeroInstance;
|
||||||
|
/// Player has a random main hero
|
||||||
|
bool hasRandomHero;
|
||||||
|
/// The default value is -1.
|
||||||
|
si32 mainCustomHeroPortrait;
|
||||||
std::string mainCustomHeroName;
|
std::string mainCustomHeroName;
|
||||||
si32 mainCustomHeroId; /// ID of custom hero (only if portrait and hero name are set, otherwise unpredicted value), -1 if none (not always -1)
|
/// ID of custom hero (only if portrait and hero name are set, otherwise unpredicted value), -1 if none (not always -1)
|
||||||
|
si32 mainCustomHeroId;
|
||||||
|
|
||||||
std::vector<SHeroName> heroesNames; /// list of placed heroes on the map
|
std::vector<SHeroName> heroesNames; /// list of placed heroes on the map
|
||||||
bool hasMainTown; /// The default value is false.
|
bool hasMainTown; /// The default value is false.
|
||||||
bool generateHeroAtMainTown; /// The default value is false.
|
bool generateHeroAtMainTown; /// The default value is false.
|
||||||
int3 posOfMainTown;
|
int3 posOfMainTown;
|
||||||
TeamID team; /// The default value NO_TEAM
|
TeamID team; /// The default value NO_TEAM
|
||||||
bool hasRandomHero; /// Player has a random hero
|
|
||||||
|
|
||||||
bool generateHero; /// Unused.
|
bool generateHero; /// Unused.
|
||||||
si32 p7; /// Unknown and unused.
|
si32 p7; /// Unknown and unused.
|
||||||
@ -91,6 +97,11 @@ struct DLL_LINKAGE PlayerInfo
|
|||||||
h & p7 & hasRandomHero & mainCustomHeroId & canHumanPlay & canComputerPlay & aiTactic & allowedFactions & isFactionRandom &
|
h & p7 & hasRandomHero & mainCustomHeroId & canHumanPlay & canComputerPlay & aiTactic & allowedFactions & isFactionRandom &
|
||||||
mainCustomHeroPortrait & mainCustomHeroName & heroesNames & hasMainTown & generateHeroAtMainTown &
|
mainCustomHeroPortrait & mainCustomHeroName & heroesNames & hasMainTown & generateHeroAtMainTown &
|
||||||
posOfMainTown & team & generateHero;
|
posOfMainTown & team & generateHero;
|
||||||
|
|
||||||
|
if(version >= 770)
|
||||||
|
{
|
||||||
|
h & mainHeroInstance;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -124,6 +135,7 @@ struct DLL_LINKAGE EventCondition
|
|||||||
EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position = int3(-1, -1, -1));
|
EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position = int3(-1, -1, -1));
|
||||||
|
|
||||||
const CGObjectInstance * object; // object that was at specified position or with instance name on start
|
const CGObjectInstance * object; // object that was at specified position or with instance name on start
|
||||||
|
EMetaclass metaType;
|
||||||
si32 value;
|
si32 value;
|
||||||
si32 objectType;
|
si32 objectType;
|
||||||
si32 objectSubtype;
|
si32 objectSubtype;
|
||||||
@ -144,6 +156,8 @@ struct DLL_LINKAGE EventCondition
|
|||||||
h & objectSubtype;
|
h & objectSubtype;
|
||||||
h & objectInstanceName;
|
h & objectInstanceName;
|
||||||
}
|
}
|
||||||
|
if(version >= 770)
|
||||||
|
h & metaType;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -203,11 +217,16 @@ struct DLL_LINKAGE Rumor
|
|||||||
std::string name;
|
std::string name;
|
||||||
std::string text;
|
std::string text;
|
||||||
|
|
||||||
|
Rumor() = default;
|
||||||
|
~Rumor() = default;
|
||||||
|
|
||||||
template <typename Handler>
|
template <typename Handler>
|
||||||
void serialize(Handler & h, const int version)
|
void serialize(Handler & h, const int version)
|
||||||
{
|
{
|
||||||
h & name & text;
|
h & name & text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void serializeJson(JsonSerializeFormat & handler);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The disposed hero struct describes which hero can be hired from which player.
|
/// The disposed hero struct describes which hero can be hired from which player.
|
||||||
|
@ -247,9 +247,9 @@ void CMapEditManager::drawRoad(ERoadType::ERoadType roadType, CRandomGenerator*
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CMapEditManager::insertObject(CGObjectInstance * obj, const int3 & pos)
|
void CMapEditManager::insertObject(CGObjectInstance * obj)
|
||||||
{
|
{
|
||||||
execute(make_unique<CInsertObjectOperation>(map, obj, pos));
|
execute(make_unique<CInsertObjectOperation>(map, obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapEditManager::execute(std::unique_ptr<CMapOperation> && operation)
|
void CMapEditManager::execute(std::unique_ptr<CMapOperation> && operation)
|
||||||
@ -422,7 +422,7 @@ CTerrainViewPatternConfig::CTerrainViewPatternConfig()
|
|||||||
flipPattern(terGroupPattern, i); //FIXME: we flip in place - doesn't make much sense now, but used to work
|
flipPattern(terGroupPattern, i); //FIXME: we flip in place - doesn't make much sense now, but used to work
|
||||||
terrainViewPatternFlips.push_back(terGroupPattern);
|
terrainViewPatternFlips.push_back(terGroupPattern);
|
||||||
}
|
}
|
||||||
terrainViewPatterns[terGroup].push_back(terrainViewPatternFlips);
|
terrainViewPatterns[terGroup].push_back(terrainViewPatternFlips);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(i == 1)
|
else if(i == 1)
|
||||||
@ -1069,15 +1069,14 @@ std::string CClearTerrainOperation::getLabel() const
|
|||||||
return "Clear Terrain";
|
return "Clear Terrain";
|
||||||
}
|
}
|
||||||
|
|
||||||
CInsertObjectOperation::CInsertObjectOperation(CMap * map, CGObjectInstance * obj, const int3 & pos)
|
CInsertObjectOperation::CInsertObjectOperation(CMap * map, CGObjectInstance * obj)
|
||||||
: CMapOperation(map), pos(pos), obj(obj)
|
: CMapOperation(map), obj(obj)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInsertObjectOperation::execute()
|
void CInsertObjectOperation::execute()
|
||||||
{
|
{
|
||||||
obj->pos = pos;
|
|
||||||
obj->id = ObjectInstanceID(map->objects.size());
|
obj->id = ObjectInstanceID(map->objects.size());
|
||||||
|
|
||||||
boost::format fmt("%s_%d");
|
boost::format fmt("%s_%d");
|
||||||
|
@ -119,10 +119,10 @@ public:
|
|||||||
static const int FLIP_PATTERN_VERTICAL = 2;
|
static const int FLIP_PATTERN_VERTICAL = 2;
|
||||||
static const int FLIP_PATTERN_BOTH = 3;
|
static const int FLIP_PATTERN_BOTH = 3;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MapRect extendTileAround(const int3 & centerPos) const;
|
MapRect extendTileAround(const int3 & centerPos) const;
|
||||||
MapRect extendTileAroundSafely(const int3 & centerPos) const; /// doesn't exceed map size
|
MapRect extendTileAroundSafely(const int3 & centerPos) const; /// doesn't exceed map size
|
||||||
|
|
||||||
CMap * map;
|
CMap * map;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -170,11 +170,11 @@ public:
|
|||||||
|
|
||||||
/// Draws terrain at the current terrain selection. The selection will be cleared automatically.
|
/// Draws terrain at the current terrain selection. The selection will be cleared automatically.
|
||||||
void drawTerrain(ETerrainType terType, CRandomGenerator * gen = nullptr);
|
void drawTerrain(ETerrainType terType, CRandomGenerator * gen = nullptr);
|
||||||
|
|
||||||
/// Draws roads at the current terrain selection. The selection will be cleared automatically.
|
/// Draws roads at the current terrain selection. The selection will be cleared automatically.
|
||||||
void drawRoad(ERoadType::ERoadType roadType, CRandomGenerator * gen = nullptr);
|
void drawRoad(ERoadType::ERoadType roadType, CRandomGenerator * gen = nullptr);
|
||||||
|
|
||||||
void insertObject(CGObjectInstance * obj, const int3 & pos);
|
void insertObject(CGObjectInstance * obj);
|
||||||
|
|
||||||
CTerrainSelection & getTerrainSelection();
|
CTerrainSelection & getTerrainSelection();
|
||||||
CObjectSelection & getObjectSelection();
|
CObjectSelection & getObjectSelection();
|
||||||
@ -267,7 +267,7 @@ struct DLL_LINKAGE TerrainViewPattern
|
|||||||
/// Optional. A rule can have points. Patterns may have a minimum count of points to reach to be successful.
|
/// Optional. A rule can have points. Patterns may have a minimum count of points to reach to be successful.
|
||||||
int points;
|
int points;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool standardRule;
|
bool standardRule;
|
||||||
bool anyRule;
|
bool anyRule;
|
||||||
bool dirtRule;
|
bool dirtRule;
|
||||||
@ -421,7 +421,7 @@ private:
|
|||||||
class CInsertObjectOperation : public CMapOperation
|
class CInsertObjectOperation : public CMapOperation
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CInsertObjectOperation(CMap * map, CGObjectInstance * obj, const int3 & pos);
|
CInsertObjectOperation(CMap * map, CGObjectInstance * obj);
|
||||||
|
|
||||||
void execute() override;
|
void execute() override;
|
||||||
void undo() override;
|
void undo() override;
|
||||||
@ -429,6 +429,5 @@ public:
|
|||||||
std::string getLabel() const override;
|
std::string getLabel() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int3 pos;
|
|
||||||
CGObjectInstance * obj;
|
CGObjectInstance * obj;
|
||||||
};
|
};
|
||||||
|
@ -130,6 +130,7 @@ void CMapLoaderH3M::init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
map->calculateGuardingGreaturePositions();
|
map->calculateGuardingGreaturePositions();
|
||||||
|
afterRead();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLoaderH3M::readHeader()
|
void CMapLoaderH3M::readHeader()
|
||||||
@ -1322,7 +1323,8 @@ void CMapLoaderH3M::readObjects()
|
|||||||
case Obj::RANDOM_DWELLING_LVL: //same as castle, fixed level
|
case Obj::RANDOM_DWELLING_LVL: //same as castle, fixed level
|
||||||
case Obj::RANDOM_DWELLING_FACTION: //level range, fixed faction
|
case Obj::RANDOM_DWELLING_FACTION: //level range, fixed faction
|
||||||
{
|
{
|
||||||
nobj = new CGDwelling();
|
auto dwelling = new CGDwelling();
|
||||||
|
nobj = dwelling;
|
||||||
CSpecObjInfo * spec = nullptr;
|
CSpecObjInfo * spec = nullptr;
|
||||||
switch(objTempl.id)
|
switch(objTempl.id)
|
||||||
{
|
{
|
||||||
@ -1330,18 +1332,31 @@ void CMapLoaderH3M::readObjects()
|
|||||||
break; case Obj::RANDOM_DWELLING_LVL: spec = new CCreGenAsCastleInfo();
|
break; case Obj::RANDOM_DWELLING_LVL: spec = new CCreGenAsCastleInfo();
|
||||||
break; case Obj::RANDOM_DWELLING_FACTION: spec = new CCreGenLeveledInfo();
|
break; case Obj::RANDOM_DWELLING_FACTION: spec = new CCreGenLeveledInfo();
|
||||||
}
|
}
|
||||||
|
spec->owner = dwelling;
|
||||||
|
|
||||||
spec->player = PlayerColor(reader.readUInt32());
|
nobj->setOwner(PlayerColor(reader.readUInt32()));
|
||||||
|
|
||||||
//216 and 217
|
//216 and 217
|
||||||
if (auto castleSpec = dynamic_cast<CCreGenAsCastleInfo *>(spec))
|
if (auto castleSpec = dynamic_cast<CCreGenAsCastleInfo *>(spec))
|
||||||
{
|
{
|
||||||
castleSpec->identifier = reader.readUInt32();
|
castleSpec->instanceId = "";
|
||||||
|
castleSpec->identifier = reader.readUInt32();
|
||||||
if(!castleSpec->identifier)
|
if(!castleSpec->identifier)
|
||||||
{
|
{
|
||||||
castleSpec->asCastle = false;
|
castleSpec->asCastle = false;
|
||||||
castleSpec->castles[0] = reader.readUInt8();
|
const int MASK_SIZE = 8;
|
||||||
castleSpec->castles[1] = reader.readUInt8();
|
ui8 mask[2];
|
||||||
|
mask[0] = reader.readUInt8();
|
||||||
|
mask[1] = reader.readUInt8();
|
||||||
|
|
||||||
|
castleSpec->allowedFactions.clear();
|
||||||
|
castleSpec->allowedFactions.resize(VLC->townh->factions.size(), false);
|
||||||
|
|
||||||
|
for(int i = 0; i < MASK_SIZE; i++)
|
||||||
|
castleSpec->allowedFactions[i] = ((mask[0] & (1 << i))>0);
|
||||||
|
|
||||||
|
for(int i = 0; i < (GameConstants::F_NUMBER-MASK_SIZE); i++)
|
||||||
|
castleSpec->allowedFactions[i+MASK_SIZE] = ((mask[1] & (1 << i))>0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1355,8 +1370,7 @@ void CMapLoaderH3M::readObjects()
|
|||||||
lvlSpec->minLevel = std::max(reader.readUInt8(), ui8(1));
|
lvlSpec->minLevel = std::max(reader.readUInt8(), ui8(1));
|
||||||
lvlSpec->maxLevel = std::min(reader.readUInt8(), ui8(7));
|
lvlSpec->maxLevel = std::min(reader.readUInt8(), ui8(7));
|
||||||
}
|
}
|
||||||
nobj->setOwner(spec->player);
|
dwelling->info = spec;
|
||||||
static_cast<CGDwelling *>(nobj)->info = spec;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Obj::QUEST_GUARD:
|
case Obj::QUEST_GUARD:
|
||||||
@ -1819,9 +1833,9 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard)
|
|||||||
|
|
||||||
switch(guard->quest->missionType)
|
switch(guard->quest->missionType)
|
||||||
{
|
{
|
||||||
case 0:
|
case CQuest::MISSION_NONE:
|
||||||
return;
|
return;
|
||||||
case 2:
|
case CQuest::MISSION_PRIMARY_STAT:
|
||||||
{
|
{
|
||||||
guard->quest->m2stats.resize(4);
|
guard->quest->m2stats.resize(4);
|
||||||
for(int x = 0; x < 4; ++x)
|
for(int x = 0; x < 4; ++x)
|
||||||
@ -1830,14 +1844,14 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case CQuest::MISSION_LEVEL:
|
||||||
case 3:
|
case CQuest::MISSION_KILL_HERO:
|
||||||
case 4:
|
case CQuest::MISSION_KILL_CREATURE:
|
||||||
{
|
{
|
||||||
guard->quest->m13489val = reader.readUInt32();
|
guard->quest->m13489val = reader.readUInt32();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 5:
|
case CQuest::MISSION_ART:
|
||||||
{
|
{
|
||||||
int artNumber = reader.readUInt8();
|
int artNumber = reader.readUInt8();
|
||||||
for(int yy = 0; yy < artNumber; ++yy)
|
for(int yy = 0; yy < artNumber; ++yy)
|
||||||
@ -1848,7 +1862,7 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 6:
|
case CQuest::MISSION_ARMY:
|
||||||
{
|
{
|
||||||
int typeNumber = reader.readUInt8();
|
int typeNumber = reader.readUInt8();
|
||||||
guard->quest->m6creatures.resize(typeNumber);
|
guard->quest->m6creatures.resize(typeNumber);
|
||||||
@ -1859,7 +1873,7 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 7:
|
case CQuest::MISSION_RESOURCES:
|
||||||
{
|
{
|
||||||
guard->quest->m7resources.resize(7);
|
guard->quest->m7resources.resize(7);
|
||||||
for(int x = 0; x < 7; ++x)
|
for(int x = 0; x < 7; ++x)
|
||||||
@ -1868,8 +1882,8 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 8:
|
case CQuest::MISSION_HERO:
|
||||||
case 9:
|
case CQuest::MISSION_PLAYER:
|
||||||
{
|
{
|
||||||
guard->quest->m13489val = reader.readUInt8();
|
guard->quest->m13489val = reader.readUInt8();
|
||||||
break;
|
break;
|
||||||
@ -2134,7 +2148,6 @@ void CMapLoaderH3M::readMessageAndGuards(std::string& message, CCreatureSet* gua
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CMapLoaderH3M::readSpells(std::set<SpellID>& dest)
|
void CMapLoaderH3M::readSpells(std::set<SpellID>& dest)
|
||||||
{
|
{
|
||||||
readBitmask(dest,9,GameConstants::SPELLS_QUANTITY,false);
|
readBitmask(dest,9,GameConstants::SPELLS_QUANTITY,false);
|
||||||
@ -2149,8 +2162,8 @@ void CMapLoaderH3M::readResourses(TResources& resources)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Indenifier>
|
template <class Indentifier>
|
||||||
void CMapLoaderH3M::readBitmask(std::set<Indenifier>& dest, const int byteCount, const int limit, bool negate)
|
void CMapLoaderH3M::readBitmask(std::set<Indentifier>& dest, const int byteCount, const int limit, bool negate)
|
||||||
{
|
{
|
||||||
std::vector<bool> temp;
|
std::vector<bool> temp;
|
||||||
temp.resize(limit,true);
|
temp.resize(limit,true);
|
||||||
@ -2160,18 +2173,11 @@ void CMapLoaderH3M::readBitmask(std::set<Indenifier>& dest, const int byteCount,
|
|||||||
{
|
{
|
||||||
if(temp[i])
|
if(temp[i])
|
||||||
{
|
{
|
||||||
dest.insert(static_cast<Indenifier>(i));
|
dest.insert(static_cast<Indentifier>(i));
|
||||||
}
|
}
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// dest.erase(static_cast<Indenifier>(i));
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void CMapLoaderH3M::readBitmask(std::vector<bool>& dest, const int byteCount, const int limit, bool negate)
|
void CMapLoaderH3M::readBitmask(std::vector<bool>& dest, const int byteCount, const int limit, bool negate)
|
||||||
{
|
{
|
||||||
for(int byte = 0; byte < byteCount; ++byte)
|
for(int byte = 0; byte < byteCount; ++byte)
|
||||||
@ -2189,7 +2195,6 @@ void CMapLoaderH3M::readBitmask(std::vector<bool>& dest, const int byteCount, co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ui8 CMapLoaderH3M::reverse(ui8 arg)
|
ui8 CMapLoaderH3M::reverse(ui8 arg)
|
||||||
{
|
{
|
||||||
ui8 ret = 0;
|
ui8 ret = 0;
|
||||||
@ -2202,3 +2207,33 @@ ui8 CMapLoaderH3M::reverse(ui8 arg)
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMapLoaderH3M::afterRead()
|
||||||
|
{
|
||||||
|
//convert main town positions for all players to actual object position, in H3M it is position of active tile
|
||||||
|
|
||||||
|
for(auto & p : map->players)
|
||||||
|
{
|
||||||
|
int3 posOfMainTown = p.posOfMainTown;
|
||||||
|
if(posOfMainTown.valid() && map->isInTheMap(posOfMainTown))
|
||||||
|
{
|
||||||
|
const TerrainTile & t = map->getTile(posOfMainTown);
|
||||||
|
|
||||||
|
const CGObjectInstance * mainTown = nullptr;
|
||||||
|
|
||||||
|
for(auto obj : t.visitableObjects)
|
||||||
|
{
|
||||||
|
if(obj->ID = Obj::TOWN)
|
||||||
|
{
|
||||||
|
mainTown = obj;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mainTown == nullptr)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
p.posOfMainTown = posOfMainTown + mainTown->getVisitableOffset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -242,6 +242,8 @@ private:
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void afterRead();
|
||||||
|
|
||||||
/** List of templates loaded from the map, used on later stage to create
|
/** List of templates loaded from the map, used on later stage to create
|
||||||
* objects but not needed for fully functional CMap */
|
* objects but not needed for fully functional CMap */
|
||||||
std::vector<ObjectTemplate> templates;
|
std::vector<ObjectTemplate> templates;
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "../filesystem/COutputStream.h"
|
#include "../filesystem/COutputStream.h"
|
||||||
#include "CMap.h"
|
#include "CMap.h"
|
||||||
#include "../CModHandler.h"
|
#include "../CModHandler.h"
|
||||||
|
#include "../CCreatureHandler.h"
|
||||||
#include "../CHeroHandler.h"
|
#include "../CHeroHandler.h"
|
||||||
#include "../CTownHandler.h"
|
#include "../CTownHandler.h"
|
||||||
#include "../VCMI_Lib.h"
|
#include "../VCMI_Lib.h"
|
||||||
@ -28,6 +29,65 @@
|
|||||||
#include "../serializer/JsonDeserializer.h"
|
#include "../serializer/JsonDeserializer.h"
|
||||||
#include "../serializer/JsonSerializer.h"
|
#include "../serializer/JsonSerializer.h"
|
||||||
|
|
||||||
|
class MapObjectResolver: public IInstanceResolver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MapObjectResolver(const CMapFormatJson * owner_);
|
||||||
|
|
||||||
|
si32 decode (const std::string & identifier) const override;
|
||||||
|
std::string encode(si32 identifier) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const CMapFormatJson * owner;
|
||||||
|
};
|
||||||
|
|
||||||
|
MapObjectResolver::MapObjectResolver(const CMapFormatJson * owner_):
|
||||||
|
owner(owner_)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
si32 MapObjectResolver::decode(const std::string & identifier) const
|
||||||
|
{
|
||||||
|
//always decode as ObjectInstanceID
|
||||||
|
|
||||||
|
auto it = owner->map->instanceNames.find(identifier);
|
||||||
|
|
||||||
|
if(it != owner->map->instanceNames.end())
|
||||||
|
{
|
||||||
|
return (*it).second->id.getNum();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << "Object not found: " << identifier;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MapObjectResolver::encode(si32 identifier) const
|
||||||
|
{
|
||||||
|
ObjectInstanceID id;
|
||||||
|
|
||||||
|
//use h3m questIdentifiers if they are present
|
||||||
|
if(owner->map->questIdentifierToId.empty())
|
||||||
|
{
|
||||||
|
id = ObjectInstanceID(identifier);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
id = owner->map->questIdentifierToId[identifier];
|
||||||
|
}
|
||||||
|
|
||||||
|
si32 oid = id.getNum();
|
||||||
|
if(oid < 0 || oid >= owner->map->objects.size())
|
||||||
|
{
|
||||||
|
logGlobal->errorStream() << "Cannot get object with id " << oid;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return owner->map->objects[oid]->instanceName;
|
||||||
|
}
|
||||||
|
|
||||||
namespace HeaderDetail
|
namespace HeaderDetail
|
||||||
{
|
{
|
||||||
static const ui8 difficultyDefault = 1;//normal
|
static const ui8 difficultyDefault = 1;//normal
|
||||||
@ -40,6 +100,12 @@ namespace HeaderDetail
|
|||||||
"EXPERT",
|
"EXPERT",
|
||||||
"IMPOSSIBLE"
|
"IMPOSSIBLE"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const std::vector<std::string> canPlayMap =
|
||||||
|
{
|
||||||
|
"AIOnly",
|
||||||
|
"PlayerOrAI"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace TriggeredEventsDetail
|
namespace TriggeredEventsDetail
|
||||||
@ -53,12 +119,67 @@ namespace TriggeredEventsDetail
|
|||||||
"have_0", "haveBuilding_0", "destroy_0"
|
"have_0", "haveBuilding_0", "destroy_0"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static const std::array<std::string, 2> typeNames = { "victory", "defeat" };
|
static const std::array<std::string, 2> typeNames = { "victory", "defeat" };
|
||||||
|
|
||||||
|
static EMetaclass decodeMetaclass(const std::string & source)
|
||||||
|
{
|
||||||
|
if(source == "")
|
||||||
|
return EMetaclass::INVALID;
|
||||||
|
auto rawId = vstd::find_pos(NMetaclass::names, source);
|
||||||
|
|
||||||
|
if(rawId >= 0)
|
||||||
|
return (EMetaclass)rawId;
|
||||||
|
else
|
||||||
|
return EMetaclass::INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string encodeIdentifier(EMetaclass metaType, si32 type)
|
||||||
|
{
|
||||||
|
std::string metaclassName = NMetaclass::names[(int)metaType];
|
||||||
|
std::string identifier = "";
|
||||||
|
|
||||||
|
switch(metaType)
|
||||||
|
{
|
||||||
|
case EMetaclass::ARTIFACT:
|
||||||
|
{
|
||||||
|
identifier = CArtHandler::encodeArtifact(type);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EMetaclass::CREATURE:
|
||||||
|
{
|
||||||
|
identifier = CCreatureHandler::encodeCreature(type);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EMetaclass::OBJECT:
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
std::set<si32> subtypes = VLC->objtypeh->knownSubObjects(type);
|
||||||
|
if(!subtypes.empty())
|
||||||
|
{
|
||||||
|
si32 subtype = *subtypes.begin();
|
||||||
|
auto handler = VLC->objtypeh->getHandlerFor(type, subtype);
|
||||||
|
identifier = handler->typeName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EMetaclass::RESOURCE:
|
||||||
|
{
|
||||||
|
identifier = GameConstants::RESOURCE_NAMES[type];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
logGlobal->error("Unsupported metaclass %s for event condition", metaclassName);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return VLC->modh->makeFullIdentifier("", metaclassName, identifier);
|
||||||
|
}
|
||||||
|
|
||||||
static EventCondition JsonToCondition(const JsonNode & node)
|
static EventCondition JsonToCondition(const JsonNode & node)
|
||||||
{
|
{
|
||||||
//todo: support of new condition format
|
|
||||||
EventCondition event;
|
EventCondition event;
|
||||||
|
|
||||||
const auto & conditionName = node.Vector()[0].String();
|
const auto & conditionName = node.Vector()[0].String();
|
||||||
@ -66,24 +187,58 @@ namespace TriggeredEventsDetail
|
|||||||
auto pos = vstd::find_pos(conditionNames, conditionName);
|
auto pos = vstd::find_pos(conditionNames, conditionName);
|
||||||
|
|
||||||
event.condition = EventCondition::EWinLoseType(pos);
|
event.condition = EventCondition::EWinLoseType(pos);
|
||||||
|
|
||||||
if (node.Vector().size() > 1)
|
if (node.Vector().size() > 1)
|
||||||
{
|
{
|
||||||
const JsonNode & data = node.Vector()[1];
|
const JsonNode & data = node.Vector()[1];
|
||||||
if (data["type"].getType() == JsonNode::DATA_STRING)
|
|
||||||
|
switch (event.condition)
|
||||||
{
|
{
|
||||||
auto identifier = VLC->modh->identifiers.getIdentifier(data["type"]);
|
case EventCondition::HAVE_0:
|
||||||
if(identifier)
|
case EventCondition::DESTROY_0:
|
||||||
event.objectType = identifier.get();
|
{
|
||||||
else
|
//todo: support subtypes
|
||||||
throw std::runtime_error("Identifier resolution failed in event condition");
|
|
||||||
|
std::string fullIdentifier = data["type"].String(), metaTypeName = "", scope = "" , identifier = "";
|
||||||
|
CModHandler::parseIdentifier(fullIdentifier, scope, metaTypeName, identifier);
|
||||||
|
|
||||||
|
event.metaType = decodeMetaclass(metaTypeName);
|
||||||
|
|
||||||
|
auto type = VLC->modh->identifiers.getIdentifier("core", fullIdentifier, false);
|
||||||
|
|
||||||
|
if(type)
|
||||||
|
event.objectType = type.get();
|
||||||
|
event.objectInstanceName = data["object"].String();
|
||||||
|
if(data["value"].isNumber())
|
||||||
|
event.value = data["value"].Integer();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EventCondition::HAVE_BUILDING_0:
|
||||||
|
{
|
||||||
|
//todo: support of new condition format HAVE_BUILDING_0
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
//old format
|
||||||
|
if (data["type"].getType() == JsonNode::DATA_STRING)
|
||||||
|
{
|
||||||
|
auto identifier = VLC->modh->identifiers.getIdentifier(data["type"]);
|
||||||
|
if(identifier)
|
||||||
|
event.objectType = identifier.get();
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Identifier resolution failed in event condition");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data["type"].isNumber())
|
||||||
|
event.objectType = data["type"].Float();
|
||||||
|
|
||||||
|
if (!data["value"].isNull())
|
||||||
|
event.value = data["value"].Float();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data["type"].getType() == JsonNode::DATA_FLOAT)
|
|
||||||
event.objectType = data["type"].Float();
|
|
||||||
|
|
||||||
if (!data["value"].isNull())
|
|
||||||
event.value = data["value"].Float();
|
|
||||||
|
|
||||||
if (!data["position"].isNull())
|
if (!data["position"].isNull())
|
||||||
{
|
{
|
||||||
auto & position = data["position"].Vector();
|
auto & position = data["position"].Vector();
|
||||||
@ -91,21 +246,15 @@ namespace TriggeredEventsDetail
|
|||||||
event.position.y = position.at(1).Float();
|
event.position.y = position.at(1).Float();
|
||||||
event.position.z = position.at(2).Float();
|
event.position.z = position.at(2).Float();
|
||||||
}
|
}
|
||||||
|
|
||||||
// if(!data["subtype"].isNull())
|
|
||||||
// {
|
|
||||||
// //todo
|
|
||||||
// }
|
|
||||||
// event.objectInstanceName = data["object"].String();
|
|
||||||
}
|
}
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
static JsonNode ConditionToJson(const EventCondition& event)
|
static JsonNode ConditionToJson(const EventCondition & event)
|
||||||
{
|
{
|
||||||
JsonNode json;
|
JsonNode json;
|
||||||
|
|
||||||
JsonVector& asVector = json.Vector();
|
JsonVector & asVector = json.Vector();
|
||||||
|
|
||||||
JsonNode condition;
|
JsonNode condition;
|
||||||
condition.String() = conditionNames.at(event.condition);
|
condition.String() = conditionNames.at(event.condition);
|
||||||
@ -113,15 +262,41 @@ namespace TriggeredEventsDetail
|
|||||||
|
|
||||||
JsonNode data;
|
JsonNode data;
|
||||||
|
|
||||||
//todo: save identifier
|
switch (event.condition)
|
||||||
|
{
|
||||||
|
case EventCondition::HAVE_0:
|
||||||
|
case EventCondition::DESTROY_0:
|
||||||
|
{
|
||||||
|
//todo: support subtypes
|
||||||
|
|
||||||
if(event.objectType != -1)
|
if(event.metaType != EMetaclass::INVALID)
|
||||||
data["type"].Float() = event.objectType;
|
data["type"].String() = encodeIdentifier(event.metaType, event.objectType);
|
||||||
|
|
||||||
if(event.value != -1)
|
if(event.value > 0)
|
||||||
data["value"].Float() = event.value;
|
data["value"].Integer() = event.value;
|
||||||
|
|
||||||
if(event.position != int3(-1,-1,-1))
|
if(event.objectInstanceName != "")
|
||||||
|
data["object"].String() = event.objectInstanceName;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EventCondition::HAVE_BUILDING_0:
|
||||||
|
{
|
||||||
|
//todo: support of new condition format HAVE_BUILDING_0
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
//old format
|
||||||
|
if(event.objectType != -1)
|
||||||
|
data["type"].Integer() = event.objectType;
|
||||||
|
|
||||||
|
if(event.value != -1)
|
||||||
|
data["value"].Integer() = event.value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(event.position != int3(-1, -1, -1))
|
||||||
{
|
{
|
||||||
auto & position = data["position"].Vector();
|
auto & position = data["position"].Vector();
|
||||||
position.resize(3);
|
position.resize(3);
|
||||||
@ -153,7 +328,7 @@ namespace TerrainDetail
|
|||||||
"", "rw", "ri", "rm", "rl"
|
"", "rw", "ri", "rm", "rl"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::array<char, 10> flipCodes =
|
static const std::array<char, 4> flipCodes =
|
||||||
{
|
{
|
||||||
'_', '-', '|', '+'
|
'_', '-', '|', '+'
|
||||||
};
|
};
|
||||||
@ -166,6 +341,12 @@ const int CMapFormatJson::VERSION_MINOR = 0;
|
|||||||
const std::string CMapFormatJson::HEADER_FILE_NAME = "header.json";
|
const std::string CMapFormatJson::HEADER_FILE_NAME = "header.json";
|
||||||
const std::string CMapFormatJson::OBJECTS_FILE_NAME = "objects.json";
|
const std::string CMapFormatJson::OBJECTS_FILE_NAME = "objects.json";
|
||||||
|
|
||||||
|
CMapFormatJson::CMapFormatJson():
|
||||||
|
mapObjectResolver(make_unique<MapObjectResolver>(this))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void CMapFormatJson::serializeAllowedFactions(JsonSerializeFormat & handler, std::set<TFaction> & value)
|
void CMapFormatJson::serializeAllowedFactions(JsonSerializeFormat & handler, std::set<TFaction> & value)
|
||||||
{
|
{
|
||||||
//TODO: unify allowed factions with others - make them std::vector<bool>
|
//TODO: unify allowed factions with others - make them std::vector<bool>
|
||||||
@ -196,14 +377,20 @@ void CMapFormatJson::serializeHeader(JsonSerializeFormat & handler)
|
|||||||
{
|
{
|
||||||
handler.serializeString("name", mapHeader->name);
|
handler.serializeString("name", mapHeader->name);
|
||||||
handler.serializeString("description", mapHeader->description);
|
handler.serializeString("description", mapHeader->description);
|
||||||
handler.serializeNumeric("heroLevelLimit", mapHeader->levelLimit);
|
handler.serializeInt("heroLevelLimit", mapHeader->levelLimit, 0);
|
||||||
|
|
||||||
//todo: support arbitrary percentage
|
//todo: support arbitrary percentage
|
||||||
handler.serializeNumericEnum("difficulty", HeaderDetail::difficultyMap, HeaderDetail::difficultyDefault, mapHeader->difficulty);
|
handler.serializeEnum("difficulty", mapHeader->difficulty, HeaderDetail::difficultyMap);
|
||||||
|
|
||||||
serializePlayerInfo(handler);
|
serializePlayerInfo(handler);
|
||||||
|
|
||||||
handler.serializeLIC("allowedHeroes", &CHeroHandler::decodeHero, &CHeroHandler::encodeHero, VLC->heroh->getDefaultAllowed(), mapHeader->allowedHeroes);
|
handler.serializeLIC("allowedHeroes", &CHeroHandler::decodeHero, &CHeroHandler::encodeHero, VLC->heroh->getDefaultAllowed(), mapHeader->allowedHeroes);
|
||||||
|
|
||||||
|
handler.serializeString("victoryString", mapHeader->victoryMessage);
|
||||||
|
handler.serializeInt("victoryIconIndex", mapHeader->victoryIconIndex);
|
||||||
|
|
||||||
|
handler.serializeString("defeatString", mapHeader->defeatMessage);
|
||||||
|
handler.serializeInt("defeatIconIndex", mapHeader->defeatIconIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFormatJson::serializePlayerInfo(JsonSerializeFormat & handler)
|
void CMapFormatJson::serializePlayerInfo(JsonSerializeFormat & handler)
|
||||||
@ -235,48 +422,100 @@ void CMapFormatJson::serializePlayerInfo(JsonSerializeFormat & handler)
|
|||||||
|
|
||||||
serializeAllowedFactions(handler, info.allowedFactions);
|
serializeAllowedFactions(handler, info.allowedFactions);
|
||||||
|
|
||||||
handler.serializeEnum("canPlay", "PlayerOrAI", "AIOnly", info.canHumanPlay);
|
handler.serializeEnum("canPlay", info.canHumanPlay, HeaderDetail::canPlayMap);
|
||||||
|
|
||||||
//saving whole structure only if position is valid
|
//saving whole structure only if position is valid
|
||||||
if(!handler.saving || info.posOfMainTown.valid())
|
if(!handler.saving || info.posOfMainTown.valid())
|
||||||
{
|
{
|
||||||
auto mainTown = handler.enterStruct("mainTown");
|
auto mainTown = handler.enterStruct("mainTown");
|
||||||
handler.serializeBool("generateHero", info.generateHeroAtMainTown);
|
handler.serializeBool("generateHero", info.generateHeroAtMainTown);
|
||||||
handler.serializeNumeric("x", info.posOfMainTown.x);
|
handler.serializeInt("x", info.posOfMainTown.x, -1);
|
||||||
handler.serializeNumeric("y", info.posOfMainTown.y);
|
handler.serializeInt("y", info.posOfMainTown.y, -1);
|
||||||
handler.serializeNumeric("l", info.posOfMainTown.z);
|
handler.serializeInt("l", info.posOfMainTown.z, -1);
|
||||||
}
|
}
|
||||||
if(!handler.saving)
|
if(!handler.saving)
|
||||||
{
|
{
|
||||||
info.hasMainTown = info.posOfMainTown.valid();
|
info.hasMainTown = info.posOfMainTown.valid();
|
||||||
}
|
}
|
||||||
|
|
||||||
//mainHero
|
handler.serializeString("mainHero", info.mainHeroInstance);//must be before "heroes"
|
||||||
|
|
||||||
//mainHeroPortrait
|
|
||||||
|
|
||||||
//mainCustomHeroName
|
|
||||||
|
|
||||||
//heroes
|
//heroes
|
||||||
|
if(handler.saving)
|
||||||
{
|
{
|
||||||
//auto heroes = playerData.enterStruct("heroes");
|
//ignoring heroesNames and saving from actual map objects
|
||||||
|
//TODO: optimize
|
||||||
|
for(auto & obj : map->objects)
|
||||||
|
{
|
||||||
|
if((obj->ID == Obj::HERO || obj->ID == Obj::RANDOM_HERO) && obj->tempOwner == PlayerColor(player))
|
||||||
|
{
|
||||||
|
CGHeroInstance * hero = dynamic_cast<CGHeroInstance *>(obj.get());
|
||||||
|
|
||||||
|
auto heroes = playerData.enterStruct("heroes");
|
||||||
|
if(hero)
|
||||||
|
{
|
||||||
|
auto heroData = heroes.enterStruct(hero->instanceName);
|
||||||
|
heroData->serializeString("name", hero->name);
|
||||||
|
|
||||||
|
if(hero->ID == Obj::HERO)
|
||||||
|
{
|
||||||
|
if(hero->type)
|
||||||
|
{
|
||||||
|
handler.serializeString("type", hero->type->identifier);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto temp = VLC->heroh->heroes[hero->subID]->identifier;
|
||||||
|
handler.serializeString("type", temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info.heroesNames.clear();
|
||||||
|
|
||||||
|
auto heroes = playerData.enterStruct("heroes");
|
||||||
|
|
||||||
|
for(const auto & hero : handler.getCurrent().Struct())
|
||||||
|
{
|
||||||
|
const JsonNode & data = hero.second;
|
||||||
|
const std::string instanceName = hero.first;
|
||||||
|
|
||||||
|
SHeroName hname;
|
||||||
|
hname.heroId = -1;
|
||||||
|
std::string rawId = data["type"].String();
|
||||||
|
|
||||||
|
if(rawId != "")
|
||||||
|
{
|
||||||
|
hname.heroId = VLC->heroh->decodeHero(rawId);
|
||||||
|
}
|
||||||
|
|
||||||
|
hname.heroName = data["name"].String();
|
||||||
|
|
||||||
|
if(instanceName == info.mainHeroInstance)
|
||||||
|
{
|
||||||
|
//this is main hero
|
||||||
|
info.mainCustomHeroName = hname.heroName;
|
||||||
|
info.hasRandomHero = (hname.heroId == -1);
|
||||||
|
info.mainCustomHeroId = hname.heroId;
|
||||||
|
info.mainCustomHeroPortrait = -1;
|
||||||
|
//todo:mainHeroPortrait
|
||||||
|
}
|
||||||
|
|
||||||
|
info.heroesNames.push_back(hname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!handler.saving)
|
handler.serializeBool("randomFaction", info.isFactionRandom);
|
||||||
{
|
|
||||||
//isFactionRandom indicates that player may select faction, depends on towns & heroes
|
|
||||||
// true if main town is random and generateHeroAtMainTown==true
|
|
||||||
// or main hero is random
|
|
||||||
//TODO: recheck mechanics
|
|
||||||
info.isFactionRandom = info.allowedFactions.size() > 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFormatJson::readTeams(JsonDeserializer & handler)
|
void CMapFormatJson::readTeams(JsonDeserializer & handler)
|
||||||
{
|
{
|
||||||
auto teams = handler.enterStruct("teams");
|
auto teams = handler.enterArray("teams");
|
||||||
const JsonNode & src = teams.get();
|
const JsonNode & src = teams.get();
|
||||||
|
|
||||||
if(src.getType() != JsonNode::DATA_VECTOR)
|
if(src.getType() != JsonNode::DATA_VECTOR)
|
||||||
@ -287,12 +526,8 @@ void CMapFormatJson::readTeams(JsonDeserializer & handler)
|
|||||||
|
|
||||||
mapHeader->howManyTeams = 0;
|
mapHeader->howManyTeams = 0;
|
||||||
for(int i = 0; i < PlayerColor::PLAYER_LIMIT_I; i++)
|
for(int i = 0; i < PlayerColor::PLAYER_LIMIT_I; i++)
|
||||||
{
|
|
||||||
if(mapHeader->players[i].canComputerPlay || mapHeader->players[i].canHumanPlay)
|
if(mapHeader->players[i].canComputerPlay || mapHeader->players[i].canHumanPlay)
|
||||||
{
|
|
||||||
mapHeader->players[i].team = TeamID(mapHeader->howManyTeams++);
|
mapHeader->players[i].team = TeamID(mapHeader->howManyTeams++);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -300,34 +535,22 @@ void CMapFormatJson::readTeams(JsonDeserializer & handler)
|
|||||||
mapHeader->howManyTeams = srcVector.size();
|
mapHeader->howManyTeams = srcVector.size();
|
||||||
|
|
||||||
for(int team = 0; team < mapHeader->howManyTeams; team++)
|
for(int team = 0; team < mapHeader->howManyTeams; team++)
|
||||||
{
|
|
||||||
for(const JsonNode & playerData : srcVector[team].Vector())
|
for(const JsonNode & playerData : srcVector[team].Vector())
|
||||||
{
|
{
|
||||||
PlayerColor player = PlayerColor(vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, playerData.String()));
|
PlayerColor player = PlayerColor(vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, playerData.String()));
|
||||||
if(player.isValidPlayer())
|
if(player.isValidPlayer())
|
||||||
{
|
|
||||||
if(mapHeader->players[player.getNum()].canAnyonePlay())
|
if(mapHeader->players[player.getNum()].canAnyonePlay())
|
||||||
{
|
|
||||||
mapHeader->players[player.getNum()].team = TeamID(team);
|
mapHeader->players[player.getNum()].team = TeamID(team);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for(PlayerInfo & player : mapHeader->players)
|
for(PlayerInfo & player : mapHeader->players)
|
||||||
{
|
|
||||||
if(player.canAnyonePlay() && player.team == TeamID::NO_TEAM)
|
if(player.canAnyonePlay() && player.team == TeamID::NO_TEAM)
|
||||||
player.team = TeamID(mapHeader->howManyTeams++);
|
player.team = TeamID(mapHeader->howManyTeams++);
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CMapFormatJson::writeTeams(JsonSerializer & handler)
|
void CMapFormatJson::writeTeams(JsonSerializer & handler)
|
||||||
{
|
{
|
||||||
auto teams = handler.enterStruct("teams");
|
|
||||||
JsonNode & dest = teams.get();
|
|
||||||
std::vector<std::set<PlayerColor>> teamsData;
|
std::vector<std::set<PlayerColor>> teamsData;
|
||||||
|
|
||||||
teamsData.resize(mapHeader->howManyTeams);
|
teamsData.resize(mapHeader->howManyTeams);
|
||||||
@ -347,41 +570,35 @@ void CMapFormatJson::writeTeams(JsonSerializer & handler)
|
|||||||
return elem.size() <= 1;
|
return elem.size() <= 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
//construct output
|
if(!teamsData.empty())
|
||||||
dest.setType(JsonNode::DATA_VECTOR);
|
|
||||||
|
|
||||||
for(const std::set<PlayerColor> & teamData : teamsData)
|
|
||||||
{
|
{
|
||||||
JsonNode team(JsonNode::DATA_VECTOR);
|
auto teams = handler.enterArray("teams");
|
||||||
for(const PlayerColor & player : teamData)
|
JsonNode & dest = teams.get();
|
||||||
|
|
||||||
|
//construct output
|
||||||
|
dest.setType(JsonNode::DATA_VECTOR);
|
||||||
|
|
||||||
|
for(const std::set<PlayerColor> & teamData : teamsData)
|
||||||
{
|
{
|
||||||
JsonNode member(JsonNode::DATA_STRING);
|
JsonNode team(JsonNode::DATA_VECTOR);
|
||||||
member.String() = GameConstants::PLAYER_COLOR_NAMES[player.getNum()];
|
for(const PlayerColor & player : teamData)
|
||||||
team.Vector().push_back(std::move(member));
|
{
|
||||||
|
JsonNode member(JsonNode::DATA_STRING);
|
||||||
|
member.String() = GameConstants::PLAYER_COLOR_NAMES[player.getNum()];
|
||||||
|
team.Vector().push_back(std::move(member));
|
||||||
|
}
|
||||||
|
dest.Vector().push_back(std::move(team));
|
||||||
}
|
}
|
||||||
dest.Vector().push_back(std::move(team));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFormatJson::serializeTriggeredEvents(JsonSerializeFormat & handler)
|
|
||||||
{
|
|
||||||
handler.serializeString("victoryString", mapHeader->victoryMessage);
|
|
||||||
handler.serializeNumeric("victoryIconIndex", mapHeader->victoryIconIndex);
|
|
||||||
|
|
||||||
handler.serializeString("defeatString", mapHeader->defeatMessage);
|
|
||||||
handler.serializeNumeric("defeatIconIndex", mapHeader->defeatIconIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CMapFormatJson::readTriggeredEvents(JsonDeserializer & handler)
|
void CMapFormatJson::readTriggeredEvents(JsonDeserializer & handler)
|
||||||
{
|
{
|
||||||
const JsonNode & input = handler.getCurrent();
|
const JsonNode & input = handler.getCurrent();
|
||||||
|
|
||||||
serializeTriggeredEvents(handler);
|
|
||||||
|
|
||||||
mapHeader->triggeredEvents.clear();
|
mapHeader->triggeredEvents.clear();
|
||||||
|
|
||||||
for (auto & entry : input["triggeredEvents"].Struct())
|
for(auto & entry : input["triggeredEvents"].Struct())
|
||||||
{
|
{
|
||||||
TriggeredEvent event;
|
TriggeredEvent event;
|
||||||
event.identifier = entry.first;
|
event.identifier = entry.first;
|
||||||
@ -405,34 +622,138 @@ void CMapFormatJson::writeTriggeredEvents(JsonSerializer & handler)
|
|||||||
{
|
{
|
||||||
JsonNode & output = handler.getCurrent();
|
JsonNode & output = handler.getCurrent();
|
||||||
|
|
||||||
serializeTriggeredEvents(handler);
|
|
||||||
|
|
||||||
JsonMap & triggeredEvents = output["triggeredEvents"].Struct();
|
JsonMap & triggeredEvents = output["triggeredEvents"].Struct();
|
||||||
|
|
||||||
for(auto event : mapHeader->triggeredEvents)
|
for(auto event : mapHeader->triggeredEvents)
|
||||||
writeTriggeredEvent(event, triggeredEvents[event.identifier]);
|
writeTriggeredEvent(event, triggeredEvents[event.identifier]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFormatJson::writeTriggeredEvent(const TriggeredEvent& event, JsonNode& dest)
|
void CMapFormatJson::writeTriggeredEvent(const TriggeredEvent & event, JsonNode & dest)
|
||||||
{
|
{
|
||||||
using namespace TriggeredEventsDetail;
|
using namespace TriggeredEventsDetail;
|
||||||
|
|
||||||
dest["message"].String() = event.onFulfill;
|
if(!event.onFulfill.empty())
|
||||||
dest["description"].String() = event.description;
|
dest["message"].String() = event.onFulfill;
|
||||||
|
|
||||||
|
if(!event.description.empty())
|
||||||
|
dest["description"].String() = event.description;
|
||||||
|
|
||||||
dest["effect"]["type"].String() = typeNames.at(size_t(event.effect.type));
|
dest["effect"]["type"].String() = typeNames.at(size_t(event.effect.type));
|
||||||
dest["effect"]["messageToSend"].String() = event.effect.toOtherMessage;
|
|
||||||
|
if(!event.effect.toOtherMessage.empty())
|
||||||
|
dest["effect"]["messageToSend"].String() = event.effect.toOtherMessage;
|
||||||
|
|
||||||
dest["condition"] = event.trigger.toJson(ConditionToJson);
|
dest["condition"] = event.trigger.toJson(ConditionToJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMapFormatJson::readDisposedHeroes(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
auto definitions = handler.enterStruct("predefinedHeroes");//DisposedHeroes are part of predefinedHeroes in VCMI map format
|
||||||
|
|
||||||
|
JsonNode & data = handler.getCurrent();
|
||||||
|
|
||||||
|
for(const auto & entry : data.Struct())
|
||||||
|
{
|
||||||
|
HeroTypeID type(VLC->heroh->decodeHero(entry.first));
|
||||||
|
|
||||||
|
ui8 mask = 0;
|
||||||
|
|
||||||
|
for(const JsonNode & playerData : entry.second["availableFor"].Vector())
|
||||||
|
{
|
||||||
|
PlayerColor player = PlayerColor(vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, playerData.String()));
|
||||||
|
if(player.isValidPlayer())
|
||||||
|
{
|
||||||
|
mask |= 1 << player.getNum();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mask != 0 && mask != GameConstants::ALL_PLAYERS && type.getNum() >= 0)
|
||||||
|
{
|
||||||
|
DisposedHero hero;
|
||||||
|
|
||||||
|
hero.heroId = type.getNum();
|
||||||
|
hero.players = mask;
|
||||||
|
//name and portrait are not used
|
||||||
|
|
||||||
|
map->disposedHeroes.push_back(hero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMapFormatJson::writeDisposedHeroes(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
if(map->disposedHeroes.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto definitions = handler.enterStruct("predefinedHeroes");//DisposedHeroes are part of predefinedHeroes in VCMI map format
|
||||||
|
|
||||||
|
JsonNode & data = handler.getCurrent();
|
||||||
|
|
||||||
|
for(const DisposedHero & hero : map->disposedHeroes)
|
||||||
|
{
|
||||||
|
std::string type = VLC->heroh->encodeHero(hero.heroId);
|
||||||
|
|
||||||
|
JsonVector & players = data[type]["availableFor"].Vector();
|
||||||
|
|
||||||
|
for(int playerNum = 0; playerNum < PlayerColor::PLAYER_LIMIT_I; playerNum++)
|
||||||
|
if((1 << playerNum) & hero.players)
|
||||||
|
{
|
||||||
|
JsonNode player(JsonNode::DATA_STRING);
|
||||||
|
player.String() = GameConstants::PLAYER_COLOR_NAMES[playerNum];
|
||||||
|
players.push_back(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMapFormatJson::serializeRumors(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
auto rumors = handler.enterArray("rumors");
|
||||||
|
rumors.serializeStruct(map->rumors);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMapFormatJson::serializePredefinedHeroes(JsonSerializeFormat & handler)
|
||||||
|
{
|
||||||
|
//todo:serializePredefinedHeroes
|
||||||
|
|
||||||
|
if(handler.saving)
|
||||||
|
{
|
||||||
|
if(!map->predefinedHeroes.empty())
|
||||||
|
{
|
||||||
|
auto predefinedHeroes = handler.enterStruct("predefinedHeroes");
|
||||||
|
|
||||||
|
for(auto & hero : map->predefinedHeroes)
|
||||||
|
{
|
||||||
|
auto predefinedHero = handler.enterStruct(hero->getHeroTypeName());
|
||||||
|
|
||||||
|
hero->serializeJsonDefinition(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto predefinedHeroes = handler.enterStruct("predefinedHeroes");
|
||||||
|
|
||||||
|
const JsonNode & data = handler.getCurrent();
|
||||||
|
|
||||||
|
for(const auto & p : data.Struct())
|
||||||
|
{
|
||||||
|
auto predefinedHero = handler.enterStruct(p.first);
|
||||||
|
|
||||||
|
CGHeroInstance * hero = new CGHeroInstance();
|
||||||
|
hero->ID = Obj::HERO;
|
||||||
|
hero->setHeroTypeName(p.first);
|
||||||
|
hero->serializeJsonDefinition(handler);
|
||||||
|
|
||||||
|
map->predefinedHeroes.push_back(hero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CMapFormatJson::serializeOptions(JsonSerializeFormat & handler)
|
void CMapFormatJson::serializeOptions(JsonSerializeFormat & handler)
|
||||||
{
|
{
|
||||||
//rumors
|
serializeRumors(handler);
|
||||||
|
|
||||||
//disposedHeroes
|
serializePredefinedHeroes(handler);
|
||||||
|
|
||||||
//predefinedHeroes
|
|
||||||
|
|
||||||
handler.serializeLIC("allowedAbilities", &CHeroHandler::decodeSkill, &CHeroHandler::encodeSkill, VLC->heroh->getDefaultAllowedAbilities(), map->allowedAbilities);
|
handler.serializeLIC("allowedAbilities", &CHeroHandler::decodeSkill, &CHeroHandler::encodeSkill, VLC->heroh->getDefaultAllowedAbilities(), map->allowedAbilities);
|
||||||
|
|
||||||
@ -440,22 +761,24 @@ void CMapFormatJson::serializeOptions(JsonSerializeFormat & handler)
|
|||||||
|
|
||||||
handler.serializeLIC("allowedSpells", &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell, VLC->spellh->getDefaultAllowed(), map->allowedSpell);
|
handler.serializeLIC("allowedSpells", &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell, VLC->spellh->getDefaultAllowed(), map->allowedSpell);
|
||||||
|
|
||||||
//events
|
//todo:events
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFormatJson::readOptions(JsonDeserializer & handler)
|
void CMapFormatJson::readOptions(JsonDeserializer & handler)
|
||||||
{
|
{
|
||||||
|
readDisposedHeroes(handler);
|
||||||
serializeOptions(handler);
|
serializeOptions(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapFormatJson::writeOptions(JsonSerializer & handler)
|
void CMapFormatJson::writeOptions(JsonSerializer & handler)
|
||||||
{
|
{
|
||||||
|
writeDisposedHeroes(handler);
|
||||||
serializeOptions(handler);
|
serializeOptions(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///CMapPatcher
|
///CMapPatcher
|
||||||
CMapPatcher::CMapPatcher(JsonNode stream):
|
CMapPatcher::CMapPatcher(JsonNode stream):
|
||||||
|
CMapFormatJson(),
|
||||||
input(stream)
|
input(stream)
|
||||||
{
|
{
|
||||||
//todo: update map patches and change this
|
//todo: update map patches and change this
|
||||||
@ -473,13 +796,13 @@ void CMapPatcher::patchMapHeader(std::unique_ptr<CMapHeader> & header)
|
|||||||
|
|
||||||
void CMapPatcher::readPatchData()
|
void CMapPatcher::readPatchData()
|
||||||
{
|
{
|
||||||
JsonDeserializer handler(input);
|
JsonDeserializer handler(mapObjectResolver.get(), input);
|
||||||
readTriggeredEvents(handler);
|
readTriggeredEvents(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///CMapLoaderJson
|
///CMapLoaderJson
|
||||||
CMapLoaderJson::CMapLoaderJson(CInputStream * stream):
|
CMapLoaderJson::CMapLoaderJson(CInputStream * stream):
|
||||||
|
CMapFormatJson(),
|
||||||
buffer(stream),
|
buffer(stream),
|
||||||
ioApi(new CProxyROIOApi(buffer)),
|
ioApi(new CProxyROIOApi(buffer)),
|
||||||
loader("", "_", ioApi)
|
loader("", "_", ioApi)
|
||||||
@ -487,17 +810,6 @@ CMapLoaderJson::CMapLoaderJson(CInputStream * stream):
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
si32 CMapLoaderJson::getIdentifier(const std::string& type, const std::string& name)
|
|
||||||
{
|
|
||||||
boost::optional<si32> res = VLC->modh->identifiers.getIdentifier("core", type, name, false);
|
|
||||||
|
|
||||||
if(!res)
|
|
||||||
{
|
|
||||||
throw new std::runtime_error("Map load failed. Identifier not resolved.");
|
|
||||||
}
|
|
||||||
return res.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<CMap> CMapLoaderJson::loadMap()
|
std::unique_ptr<CMap> CMapLoaderJson::loadMap()
|
||||||
{
|
{
|
||||||
LOG_TRACE(logGlobal);
|
LOG_TRACE(logGlobal);
|
||||||
@ -560,10 +872,10 @@ void CMapLoaderJson::readHeader(const bool complete)
|
|||||||
|
|
||||||
if(fileVersionMinor > VERSION_MINOR)
|
if(fileVersionMinor > VERSION_MINOR)
|
||||||
{
|
{
|
||||||
logGlobal->traceStream() << "Too new map format revision: " << fileVersionMinor << ". This map should work but some of map features may be ignored.";
|
logGlobal->warnStream() << "Too new map format revision: " << fileVersionMinor << ". This map should work but some of map features may be ignored.";
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonDeserializer handler(header);
|
JsonDeserializer handler(mapObjectResolver.get(), header);
|
||||||
|
|
||||||
mapHeader->version = EMapFormat::VCMI;//todo: new version field
|
mapHeader->version = EMapFormat::VCMI;//todo: new version field
|
||||||
|
|
||||||
@ -586,20 +898,18 @@ void CMapLoaderJson::readHeader(const bool complete)
|
|||||||
|
|
||||||
readTriggeredEvents(handler);
|
readTriggeredEvents(handler);
|
||||||
|
|
||||||
|
|
||||||
readTeams(handler);
|
readTeams(handler);
|
||||||
//TODO: readHeader
|
//TODO: check mods
|
||||||
|
|
||||||
if(complete)
|
if(complete)
|
||||||
readOptions(handler);
|
readOptions(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMapLoaderJson::readTerrainTile(const std::string & src, TerrainTile & tile)
|
||||||
void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|
||||||
{
|
{
|
||||||
using namespace TerrainDetail;
|
using namespace TerrainDetail;
|
||||||
{//terrain type
|
{//terrain type
|
||||||
const std::string typeCode = src.substr(0,2);
|
const std::string typeCode = src.substr(0, 2);
|
||||||
|
|
||||||
int rawType = vstd::find_pos(terrainCodes, typeCode);
|
int rawType = vstd::find_pos(terrainCodes, typeCode);
|
||||||
|
|
||||||
@ -616,7 +926,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|||||||
int len = pos - startPos;
|
int len = pos - startPos;
|
||||||
if(len<=0)
|
if(len<=0)
|
||||||
throw new std::runtime_error("Invalid terrain view in "+src);
|
throw new std::runtime_error("Invalid terrain view in "+src);
|
||||||
const std::string rawCode = src.substr(startPos,len);
|
const std::string rawCode = src.substr(startPos, len);
|
||||||
tile.terView = atoi(rawCode.c_str());
|
tile.terView = atoi(rawCode.c_str());
|
||||||
startPos+=len;
|
startPos+=len;
|
||||||
}
|
}
|
||||||
@ -631,7 +941,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|||||||
return;
|
return;
|
||||||
bool hasRoad = true;
|
bool hasRoad = true;
|
||||||
{//road type
|
{//road type
|
||||||
const std::string typeCode = src.substr(startPos,2);
|
const std::string typeCode = src.substr(startPos, 2);
|
||||||
startPos+=2;
|
startPos+=2;
|
||||||
int rawType = vstd::find_pos(roadCodes, typeCode);
|
int rawType = vstd::find_pos(roadCodes, typeCode);
|
||||||
if(rawType < 0)
|
if(rawType < 0)
|
||||||
@ -656,7 +966,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|||||||
int len = pos - startPos;
|
int len = pos - startPos;
|
||||||
if(len<=0)
|
if(len<=0)
|
||||||
throw new std::runtime_error("Invalid road dir in "+src);
|
throw new std::runtime_error("Invalid road dir in "+src);
|
||||||
const std::string rawCode = src.substr(startPos,len);
|
const std::string rawCode = src.substr(startPos, len);
|
||||||
tile.roadDir = atoi(rawCode.c_str());
|
tile.roadDir = atoi(rawCode.c_str());
|
||||||
startPos+=len;
|
startPos+=len;
|
||||||
}
|
}
|
||||||
@ -672,7 +982,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|||||||
return;
|
return;
|
||||||
if(hasRoad)
|
if(hasRoad)
|
||||||
{//river type
|
{//river type
|
||||||
const std::string typeCode = src.substr(startPos,2);
|
const std::string typeCode = src.substr(startPos, 2);
|
||||||
startPos+=2;
|
startPos+=2;
|
||||||
int rawType = vstd::find_pos(riverCodes, typeCode);
|
int rawType = vstd::find_pos(riverCodes, typeCode);
|
||||||
if(rawType < 0)
|
if(rawType < 0)
|
||||||
@ -686,7 +996,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|||||||
int len = pos - startPos;
|
int len = pos - startPos;
|
||||||
if(len<=0)
|
if(len<=0)
|
||||||
throw new std::runtime_error("Invalid river dir in "+src);
|
throw new std::runtime_error("Invalid river dir in "+src);
|
||||||
const std::string rawCode = src.substr(startPos,len);
|
const std::string rawCode = src.substr(startPos, len);
|
||||||
tile.riverDir = atoi(rawCode.c_str());
|
tile.riverDir = atoi(rawCode.c_str());
|
||||||
startPos+=len;
|
startPos+=len;
|
||||||
}
|
}
|
||||||
@ -699,9 +1009,9 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLoaderJson::readTerrainLevel(const JsonNode& src, const int index)
|
void CMapLoaderJson::readTerrainLevel(const JsonNode & src, const int index)
|
||||||
{
|
{
|
||||||
int3 pos(0,0,index);
|
int3 pos(0, 0, index);
|
||||||
|
|
||||||
const JsonVector & rows = src.Vector();
|
const JsonVector & rows = src.Vector();
|
||||||
|
|
||||||
@ -734,15 +1044,15 @@ void CMapLoaderJson::readTerrain()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CMapLoaderJson::MapObjectLoader::MapObjectLoader(CMapLoaderJson * _owner, JsonMap::value_type& json):
|
CMapLoaderJson::MapObjectLoader::MapObjectLoader(CMapLoaderJson * _owner, JsonMap::value_type & json):
|
||||||
owner(_owner), instance(nullptr),id(-1), jsonKey(json.first), configuration(json.second)
|
owner(_owner), instance(nullptr), id(-1), jsonKey(json.first), configuration(json.second)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLoaderJson::MapObjectLoader::construct()
|
void CMapLoaderJson::MapObjectLoader::construct()
|
||||||
{
|
{
|
||||||
logGlobal->debugStream() <<"Loading: " <<jsonKey;
|
//logGlobal->debugStream() <<"Loading: " <<jsonKey;
|
||||||
|
|
||||||
//TODO:consider move to ObjectTypeHandler
|
//TODO:consider move to ObjectTypeHandler
|
||||||
//find type handler
|
//find type handler
|
||||||
@ -778,9 +1088,9 @@ void CMapLoaderJson::MapObjectLoader::construct()
|
|||||||
|
|
||||||
ObjectTemplate appearance;
|
ObjectTemplate appearance;
|
||||||
|
|
||||||
appearance.readJson(configuration["template"], false);
|
|
||||||
appearance.id = Obj(handler->type);
|
appearance.id = Obj(handler->type);
|
||||||
appearance.subid = handler->subtype;
|
appearance.subid = handler->subtype;
|
||||||
|
appearance.readJson(configuration["template"], false);
|
||||||
|
|
||||||
instance = handler->create(appearance);
|
instance = handler->create(appearance);
|
||||||
|
|
||||||
@ -795,14 +1105,15 @@ void CMapLoaderJson::MapObjectLoader::configure()
|
|||||||
if(nullptr == instance)
|
if(nullptr == instance)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
JsonDeserializer handler(configuration);
|
JsonDeserializer handler(owner->mapObjectResolver.get(), configuration);
|
||||||
|
|
||||||
instance->serializeJson(handler);
|
instance->serializeJson(handler);
|
||||||
|
|
||||||
|
//artifact instance serialization requires access to Map object, handle it here for now
|
||||||
|
//todo: find better solution for artifact instance serialization
|
||||||
|
|
||||||
if(auto art = dynamic_cast<CGArtifact *>(instance))
|
if(auto art = dynamic_cast<CGArtifact *>(instance))
|
||||||
{
|
{
|
||||||
//todo: find better place for this code
|
|
||||||
|
|
||||||
int artID = ArtifactID::NONE;
|
int artID = ArtifactID::NONE;
|
||||||
int spellID = -1;
|
int spellID = -1;
|
||||||
|
|
||||||
@ -824,6 +1135,12 @@ void CMapLoaderJson::MapObjectLoader::configure()
|
|||||||
|
|
||||||
art->storedArtifact = CArtifactInstance::createArtifact(owner->map, artID, spellID);
|
art->storedArtifact = CArtifactInstance::createArtifact(owner->map, artID, spellID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(auto hero = dynamic_cast<CGHeroInstance *>(instance))
|
||||||
|
{
|
||||||
|
auto o = handler.enterStruct("options");
|
||||||
|
hero->serializeJsonArtifacts(handler, "artifacts", owner->map);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLoaderJson::readObjects()
|
void CMapLoaderJson::readObjects()
|
||||||
@ -853,6 +1170,7 @@ void CMapLoaderJson::readObjects()
|
|||||||
|
|
||||||
///CMapSaverJson
|
///CMapSaverJson
|
||||||
CMapSaverJson::CMapSaverJson(CInputOutputStream * stream):
|
CMapSaverJson::CMapSaverJson(CInputOutputStream * stream):
|
||||||
|
CMapFormatJson(),
|
||||||
buffer(stream),
|
buffer(stream),
|
||||||
ioApi(new CProxyIOApi(buffer)),
|
ioApi(new CProxyIOApi(buffer)),
|
||||||
saver(ioApi, "_")
|
saver(ioApi, "_")
|
||||||
@ -866,7 +1184,7 @@ CMapSaverJson::~CMapSaverJson()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapSaverJson::addToArchive(const JsonNode& data, const std::string& filename)
|
void CMapSaverJson::addToArchive(const JsonNode & data, const std::string & filename)
|
||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << data;
|
out << data;
|
||||||
@ -893,7 +1211,7 @@ void CMapSaverJson::saveMap(const std::unique_ptr<CMap>& map)
|
|||||||
void CMapSaverJson::writeHeader()
|
void CMapSaverJson::writeHeader()
|
||||||
{
|
{
|
||||||
JsonNode header;
|
JsonNode header;
|
||||||
JsonSerializer handler(header);
|
JsonSerializer handler(mapObjectResolver.get(), header);
|
||||||
|
|
||||||
header["versionMajor"].Float() = VERSION_MAJOR;
|
header["versionMajor"].Float() = VERSION_MAJOR;
|
||||||
header["versionMinor"].Float() = VERSION_MINOR;
|
header["versionMinor"].Float() = VERSION_MINOR;
|
||||||
@ -933,14 +1251,10 @@ const std::string CMapSaverJson::writeTerrainTile(const TerrainTile & tile)
|
|||||||
out << terrainCodes.at(int(tile.terType)) << (int)tile.terView << flipCodes[tile.extTileFlags % 4];
|
out << terrainCodes.at(int(tile.terType)) << (int)tile.terView << flipCodes[tile.extTileFlags % 4];
|
||||||
|
|
||||||
if(tile.roadType != ERoadType::NO_ROAD)
|
if(tile.roadType != ERoadType::NO_ROAD)
|
||||||
{
|
|
||||||
out << roadCodes.at(int(tile.roadType)) << (int)tile.roadDir << flipCodes[(tile.extTileFlags >> 4) % 4];
|
out << roadCodes.at(int(tile.roadType)) << (int)tile.roadDir << flipCodes[(tile.extTileFlags >> 4) % 4];
|
||||||
}
|
|
||||||
|
|
||||||
if(tile.riverType != ERiverType::NO_RIVER)
|
if(tile.riverType != ERiverType::NO_RIVER)
|
||||||
{
|
|
||||||
out << riverCodes.at(int(tile.riverType)) << (int)tile.riverDir << flipCodes[(tile.extTileFlags >> 2) % 4];
|
out << riverCodes.at(int(tile.riverType)) << (int)tile.riverDir << flipCodes[(tile.extTileFlags >> 2) % 4];
|
||||||
}
|
|
||||||
|
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
@ -983,7 +1297,7 @@ void CMapSaverJson::writeObjects()
|
|||||||
{
|
{
|
||||||
JsonNode data(JsonNode::DATA_STRUCT);
|
JsonNode data(JsonNode::DATA_STRUCT);
|
||||||
|
|
||||||
JsonSerializer handler(data);
|
JsonSerializer handler(mapObjectResolver.get(), data);
|
||||||
|
|
||||||
for(CGObjectInstance * obj : map->objects)
|
for(CGObjectInstance * obj : map->objects)
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
#include "../filesystem/CZipLoader.h"
|
#include "../filesystem/CZipLoader.h"
|
||||||
#include "../GameConstants.h"
|
#include "../GameConstants.h"
|
||||||
|
|
||||||
|
#include "../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
struct TriggeredEvent;
|
struct TriggeredEvent;
|
||||||
struct TerrainTile;
|
struct TerrainTile;
|
||||||
struct PlayerInfo;
|
struct PlayerInfo;
|
||||||
@ -39,6 +41,8 @@ public:
|
|||||||
int fileVersionMajor;
|
int fileVersionMajor;
|
||||||
int fileVersionMinor;
|
int fileVersionMinor;
|
||||||
protected:
|
protected:
|
||||||
|
friend class MapObjectResolver;
|
||||||
|
std::unique_ptr<IInstanceResolver> mapObjectResolver;
|
||||||
|
|
||||||
/** ptr to the map object which gets filled by data from the buffer or written to buffer */
|
/** ptr to the map object which gets filled by data from the buffer or written to buffer */
|
||||||
CMap * map;
|
CMap * map;
|
||||||
@ -49,6 +53,8 @@ protected:
|
|||||||
*/
|
*/
|
||||||
CMapHeader * mapHeader;
|
CMapHeader * mapHeader;
|
||||||
|
|
||||||
|
CMapFormatJson();
|
||||||
|
|
||||||
void serializeAllowedFactions(JsonSerializeFormat & handler, std::set<TFaction> & value);
|
void serializeAllowedFactions(JsonSerializeFormat & handler, std::set<TFaction> & value);
|
||||||
|
|
||||||
///common part of header saving/loading
|
///common part of header saving/loading
|
||||||
@ -67,10 +73,6 @@ protected:
|
|||||||
*/
|
*/
|
||||||
void writeTeams(JsonSerializer & handler);
|
void writeTeams(JsonSerializer & handler);
|
||||||
|
|
||||||
|
|
||||||
///common part triggered events of saving/loading
|
|
||||||
void serializeTriggeredEvents(JsonSerializeFormat & handler);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads triggered events, including victory/loss conditions
|
* Reads triggered events, including victory/loss conditions
|
||||||
*/
|
*/
|
||||||
@ -91,7 +93,13 @@ protected:
|
|||||||
*/
|
*/
|
||||||
void writeTriggeredEvent(const TriggeredEvent & event, JsonNode & dest);
|
void writeTriggeredEvent(const TriggeredEvent & event, JsonNode & dest);
|
||||||
|
|
||||||
|
void writeDisposedHeroes(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
|
void readDisposedHeroes(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
|
void serializePredefinedHeroes(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
|
void serializeRumors(JsonSerializeFormat & handler);
|
||||||
|
|
||||||
///common part of map attributes saving/loading
|
///common part of map attributes saving/loading
|
||||||
void serializeOptions(JsonSerializeFormat & handler);
|
void serializeOptions(JsonSerializeFormat & handler);
|
||||||
@ -130,7 +138,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
void readPatchData();
|
void readPatchData();
|
||||||
|
|
||||||
|
|
||||||
JsonNode input;
|
JsonNode input;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -174,11 +181,8 @@ private:
|
|||||||
|
|
||||||
///configures object
|
///configures object
|
||||||
void configure();
|
void configure();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
si32 getIdentifier(const std::string & type, const std::string & name);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the map header.
|
* Reads the map header.
|
||||||
*/
|
*/
|
||||||
|
@ -763,7 +763,7 @@ bool CRmgTemplateZone::createRoad(CMapGenerator* gen, const int3& src, const int
|
|||||||
auto pq = std::move(createPiorityQueue()); // The set of tentative nodes to be evaluated, initially containing the start node
|
auto pq = std::move(createPiorityQueue()); // The set of tentative nodes to be evaluated, initially containing the start node
|
||||||
std::map<int3, int3> cameFrom; // The map of navigated nodes.
|
std::map<int3, int3> cameFrom; // The map of navigated nodes.
|
||||||
std::map<int3, float> distances;
|
std::map<int3, float> distances;
|
||||||
|
|
||||||
gen->setRoad (src, ERoadType::NO_ROAD); //just in case zone guard already has road under it. Road under nodes will be added at very end
|
gen->setRoad (src, ERoadType::NO_ROAD); //just in case zone guard already has road under it. Road under nodes will be added at very end
|
||||||
|
|
||||||
cameFrom[src] = int3(-1, -1, -1); //first node points to finish condition
|
cameFrom[src] = int3(-1, -1, -1); //first node points to finish condition
|
||||||
@ -1432,7 +1432,7 @@ void CRmgTemplateZone::initTownType (CMapGenerator* gen)
|
|||||||
playerInfo.allowedFactions.clear();
|
playerInfo.allowedFactions.clear();
|
||||||
playerInfo.allowedFactions.insert(townType);
|
playerInfo.allowedFactions.insert(townType);
|
||||||
playerInfo.hasMainTown = true;
|
playerInfo.hasMainTown = true;
|
||||||
playerInfo.posOfMainTown = town->pos - town->getVisitableOffset();
|
playerInfo.posOfMainTown = town->pos;
|
||||||
playerInfo.generateHeroAtMainTown = true;
|
playerInfo.generateHeroAtMainTown = true;
|
||||||
|
|
||||||
//now create actual towns
|
//now create actual towns
|
||||||
@ -2092,7 +2092,7 @@ void CRmgTemplateZone::checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance*
|
|||||||
object->appearance = templates.front();
|
object->appearance = templates.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
gen->editManager->insertObject(object, pos);
|
gen->editManager->insertObject(object);
|
||||||
//logGlobal->traceStream() << boost::format ("Successfully inserted object (%d,%d) at pos %s") %object->ID %object->subID %pos();
|
//logGlobal->traceStream() << boost::format ("Successfully inserted object (%d,%d) at pos %s") %object->ID %object->subID %pos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#include "../ConstTransitivePtr.h"
|
#include "../ConstTransitivePtr.h"
|
||||||
#include "../GameConstants.h"
|
#include "../GameConstants.h"
|
||||||
|
|
||||||
const ui32 SERIALIZATION_VERSION = 762;
|
const ui32 SERIALIZATION_VERSION = 770;
|
||||||
const ui32 MINIMAL_SERIALIZATION_VERSION = 753;
|
const ui32 MINIMAL_SERIALIZATION_VERSION = 753;
|
||||||
const std::string SAVEGAME_MAGIC = "VCMISVG";
|
const std::string SAVEGAME_MAGIC = "VCMISVG";
|
||||||
|
|
||||||
|
@ -14,63 +14,88 @@
|
|||||||
|
|
||||||
#include "../JsonNode.h"
|
#include "../JsonNode.h"
|
||||||
|
|
||||||
JsonDeserializer::JsonDeserializer(JsonNode & root_):
|
JsonDeserializer::JsonDeserializer(const IInstanceResolver * instanceResolver_, JsonNode & root_):
|
||||||
JsonSerializeFormat(root_, false)
|
JsonSerializeFormat(instanceResolver_, root_, false)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonDeserializer::serializeBool(const std::string & fieldName, bool & value)
|
void JsonDeserializer::serializeInternal(const std::string & fieldName, boost::logic::tribool & value)
|
||||||
{
|
{
|
||||||
value = current->operator[](fieldName).Bool();
|
const JsonNode & data = current->operator[](fieldName);
|
||||||
}
|
if(data.getType() != JsonNode::DATA_BOOL)
|
||||||
|
value = boost::logic::indeterminate;
|
||||||
void JsonDeserializer::serializeEnum(const std::string & fieldName, const std::string & trueValue, const std::string & falseValue, bool & value)
|
|
||||||
{
|
|
||||||
const JsonNode & tmp = current->operator[](fieldName);
|
|
||||||
|
|
||||||
value = tmp.String() == trueValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonDeserializer::serializeFloat(const std::string & fieldName, double & value)
|
|
||||||
{
|
|
||||||
value = current->operator[](fieldName).Float();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonDeserializer::serializeIntEnum(const std::string & fieldName, const std::vector<std::string> & enumMap, const si32 defaultValue, si32 & value)
|
|
||||||
{
|
|
||||||
const std::string & valueName = current->operator[](fieldName).String();
|
|
||||||
|
|
||||||
si32 rawValue = vstd::find_pos(enumMap, valueName);
|
|
||||||
if(rawValue < 0)
|
|
||||||
value = defaultValue;
|
|
||||||
else
|
else
|
||||||
value = rawValue;
|
value = data.Bool();
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonDeserializer::serializeIntId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const si32 defaultValue, si32 & value)
|
void JsonDeserializer::serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
{
|
{
|
||||||
std::string identifier;
|
std::string identifier;
|
||||||
serializeString(fieldName, identifier);
|
serializeString(fieldName, identifier);
|
||||||
|
|
||||||
if(identifier == "")
|
value = defaultValue ? defaultValue.get() : 0;
|
||||||
{
|
|
||||||
value = defaultValue;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
si32 rawId = decoder(identifier);
|
if(identifier != "")
|
||||||
if(rawId >= 0)
|
{
|
||||||
value = rawId;
|
si32 rawId = decoder(identifier);
|
||||||
|
if(rawId >= 0)
|
||||||
|
value = rawId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonDeserializer::serializeInternal(const std::string & fieldName, std::vector<si32> & value, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
|
{
|
||||||
|
const JsonVector & data = current->operator[](fieldName).Vector();
|
||||||
|
|
||||||
|
value.clear();
|
||||||
|
value.reserve(data.size());
|
||||||
|
|
||||||
|
for(const JsonNode elem : data)
|
||||||
|
{
|
||||||
|
si32 rawId = decoder(elem.String());
|
||||||
|
|
||||||
|
if(rawId >= 0)
|
||||||
|
value.push_back(rawId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonDeserializer::serializeInternal(const std::string & fieldName, double & value, const boost::optional<double> & defaultValue)
|
||||||
|
{
|
||||||
|
const JsonNode & data = current->operator[](fieldName);
|
||||||
|
|
||||||
|
if(!data.isNumber())
|
||||||
|
value = defaultValue ? defaultValue.get() : 0;//todo: report error on not null?
|
||||||
else
|
else
|
||||||
value = defaultValue;
|
value = data.Float();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonDeserializer::serializeInternal(const std::string & fieldName, si64 & value, const boost::optional<si64> & defaultValue)
|
||||||
|
{
|
||||||
|
const JsonNode & data = current->operator[](fieldName);
|
||||||
|
|
||||||
|
if(!data.isNumber())
|
||||||
|
value = defaultValue ? defaultValue.get() : 0;//todo: report error on not null?
|
||||||
|
else
|
||||||
|
value = data.Integer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonDeserializer::serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const std::vector<std::string> & enumMap)
|
||||||
|
{
|
||||||
|
const std::string & valueName = current->operator[](fieldName).String();
|
||||||
|
|
||||||
|
const si32 actualOptional = defaultValue ? defaultValue.get() : 0;
|
||||||
|
|
||||||
|
si32 rawValue = vstd::find_pos(enumMap, valueName);
|
||||||
|
if(rawValue < 0)
|
||||||
|
value = actualOptional;
|
||||||
|
else
|
||||||
|
value = rawValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonDeserializer::serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value)
|
void JsonDeserializer::serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value)
|
||||||
{
|
{
|
||||||
const JsonNode & field = current->operator[](fieldName);
|
const JsonNode & field = current->operator[](fieldName);
|
||||||
if(field.isNull())
|
|
||||||
return;
|
|
||||||
|
|
||||||
const JsonNode & anyOf = field["anyOf"];
|
const JsonNode & anyOf = field["anyOf"];
|
||||||
const JsonNode & allOf = field["allOf"];
|
const JsonNode & allOf = field["allOf"];
|
||||||
@ -139,6 +164,51 @@ void JsonDeserializer::serializeLIC(const std::string & fieldName, LIC & value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JsonDeserializer::serializeLIC(const std::string & fieldName, LICSet & value)
|
||||||
|
{
|
||||||
|
const JsonNode & field = current->operator[](fieldName);
|
||||||
|
|
||||||
|
const JsonNode & anyOf = field["anyOf"];
|
||||||
|
const JsonNode & allOf = field["allOf"];
|
||||||
|
const JsonNode & noneOf = field["noneOf"];
|
||||||
|
|
||||||
|
value.all.clear();
|
||||||
|
value.none.clear();
|
||||||
|
|
||||||
|
if(anyOf.Vector().empty())
|
||||||
|
{
|
||||||
|
//permissive mode
|
||||||
|
value.any = value.standard;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//restrictive mode
|
||||||
|
value.any.clear();
|
||||||
|
readLICPart(anyOf, value.decoder, value.any);
|
||||||
|
|
||||||
|
for(si32 item : value.standard)
|
||||||
|
if(!vstd::contains(value.any, item))
|
||||||
|
value.none.insert(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
readLICPart(allOf, value.decoder, value.all);
|
||||||
|
readLICPart(noneOf, value.decoder, value.none);
|
||||||
|
|
||||||
|
//remove any banned from allowed and required
|
||||||
|
auto isBanned = [&value](const si32 item)->bool
|
||||||
|
{
|
||||||
|
return vstd::contains(value.none, item);
|
||||||
|
};
|
||||||
|
vstd::erase_if(value.all, isBanned);
|
||||||
|
vstd::erase_if(value.any, isBanned);
|
||||||
|
|
||||||
|
//add all required to allowed
|
||||||
|
for(si32 item : value.all)
|
||||||
|
{
|
||||||
|
value.any.insert(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JsonDeserializer::serializeString(const std::string & fieldName, std::string & value)
|
void JsonDeserializer::serializeString(const std::string & fieldName, std::string & value)
|
||||||
{
|
{
|
||||||
value = current->operator[](fieldName).String();
|
value = current->operator[](fieldName).String();
|
||||||
@ -161,3 +231,15 @@ void JsonDeserializer::readLICPart(const JsonNode & part, const TDecoder & decod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JsonDeserializer::readLICPart(const JsonNode & part, const TDecoder & decoder, std::set<si32> & value)
|
||||||
|
{
|
||||||
|
for(size_t index = 0; index < part.Vector().size(); index++)
|
||||||
|
{
|
||||||
|
const std::string & identifier = part.Vector()[index].String();
|
||||||
|
|
||||||
|
const si32 rawId = decoder(identifier);
|
||||||
|
if(rawId != -1)
|
||||||
|
value.insert(rawId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -17,18 +17,22 @@ class JsonNode;
|
|||||||
class JsonDeserializer: public JsonSerializeFormat
|
class JsonDeserializer: public JsonSerializeFormat
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
JsonDeserializer(JsonNode & root_);
|
JsonDeserializer(const IInstanceResolver * instanceResolver_, JsonNode & root_);
|
||||||
|
|
||||||
void serializeBool(const std::string & fieldName, bool & value) override;
|
|
||||||
void serializeEnum(const std::string & fieldName, const std::string & trueValue, const std::string & falseValue, bool & value) override;
|
|
||||||
void serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value) override;
|
void serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value) override;
|
||||||
void serializeLIC(const std::string & fieldName, LIC & value) override;
|
void serializeLIC(const std::string & fieldName, LIC & value) override;
|
||||||
|
void serializeLIC(const std::string & fieldName, LICSet & value) override;
|
||||||
void serializeString(const std::string & fieldName, std::string & value) override;
|
void serializeString(const std::string & fieldName, std::string & value) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void serializeFloat(const std::string & fieldName, double & value) override;
|
void serializeInternal(const std::string & fieldName, boost::logic::tribool & value) override;
|
||||||
void serializeIntEnum(const std::string & fieldName, const std::vector<std::string> & enumMap, const si32 defaultValue, si32 & value) override;
|
void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const TDecoder & decoder, const TEncoder & encoder) override;
|
||||||
void serializeIntId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const si32 defaultValue, si32 & value) override;
|
void serializeInternal(const std::string & fieldName, std::vector<si32> & value, const TDecoder & decoder, const TEncoder & encoder) override;
|
||||||
|
void serializeInternal(const std::string & fieldName, double & value, const boost::optional<double> & defaultValue) override;
|
||||||
|
void serializeInternal(const std::string & fieldName, si64 & value, const boost::optional<si64> & defaultValue) override;
|
||||||
|
void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const std::vector<std::string> & enumMap) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void readLICPart(const JsonNode & part, const TDecoder & decoder, const bool val, std::vector<bool> & value);
|
void readLICPart(const JsonNode & part, const TDecoder & decoder, const bool val, std::vector<bool> & value);
|
||||||
|
void readLICPart(const JsonNode & part, const TDecoder & decoder, std::set<si32> & value);
|
||||||
};
|
};
|
||||||
|
@ -14,57 +14,147 @@
|
|||||||
|
|
||||||
#include "../JsonNode.h"
|
#include "../JsonNode.h"
|
||||||
|
|
||||||
|
//JsonSerializeHelper
|
||||||
//JsonStructSerializer
|
JsonSerializeHelper::JsonSerializeHelper(JsonSerializeHelper && other):
|
||||||
JsonStructSerializer::JsonStructSerializer(JsonStructSerializer&& other):
|
|
||||||
restoreState(false),
|
|
||||||
owner(other.owner),
|
owner(other.owner),
|
||||||
|
thisNode(other.thisNode),
|
||||||
parentNode(other.parentNode),
|
parentNode(other.parentNode),
|
||||||
thisNode(other.thisNode)
|
restoreState(false)
|
||||||
{
|
{
|
||||||
|
std::swap(restoreState, other.restoreState);
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonStructSerializer::~JsonStructSerializer()
|
JsonSerializeHelper::~JsonSerializeHelper()
|
||||||
{
|
{
|
||||||
if(restoreState)
|
if(restoreState)
|
||||||
owner.current = parentNode;
|
owner.current = parentNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonStructSerializer::JsonStructSerializer(JsonSerializeFormat& owner_, const std::string& fieldName):
|
JsonNode & JsonSerializeHelper::get()
|
||||||
restoreState(true),
|
|
||||||
owner(owner_),
|
|
||||||
parentNode(owner.current),
|
|
||||||
thisNode(&(parentNode->operator[](fieldName)))
|
|
||||||
{
|
{
|
||||||
owner.current = thisNode;
|
return * thisNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonStructSerializer::JsonStructSerializer(JsonStructSerializer & parent, const std::string & fieldName):
|
JsonSerializeFormat * JsonSerializeHelper::operator->()
|
||||||
restoreState(true),
|
|
||||||
owner(parent.owner),
|
|
||||||
parentNode(parent.thisNode),
|
|
||||||
thisNode(&(parentNode->operator[](fieldName)))
|
|
||||||
{
|
|
||||||
owner.current = thisNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonStructSerializer JsonStructSerializer::enterStruct(const std::string & fieldName)
|
|
||||||
{
|
|
||||||
return JsonStructSerializer(*this, fieldName);
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonNode& JsonStructSerializer::get()
|
|
||||||
{
|
|
||||||
return *thisNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonSerializeFormat * JsonStructSerializer::operator->()
|
|
||||||
{
|
{
|
||||||
return &owner;
|
return &owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonSerializeFormat::LIC::LIC(const std::vector<bool> & Standard, const TDecoder & Decoder, const TEncoder & Encoder):
|
JsonSerializeHelper::JsonSerializeHelper(JsonSerializeFormat & owner_, JsonNode * thisNode_):
|
||||||
|
owner(owner_),
|
||||||
|
thisNode(thisNode_),
|
||||||
|
parentNode(owner.current),
|
||||||
|
restoreState(true)
|
||||||
|
{
|
||||||
|
owner.current = thisNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonSerializeHelper::JsonSerializeHelper(JsonSerializeHelper & parent, const std::string & fieldName):
|
||||||
|
owner(parent.owner),
|
||||||
|
thisNode(&(parent.thisNode->operator[](fieldName))),
|
||||||
|
parentNode(parent.thisNode),
|
||||||
|
restoreState(true)
|
||||||
|
{
|
||||||
|
owner.current = thisNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonStructSerializer JsonSerializeHelper::enterStruct(const std::string & fieldName)
|
||||||
|
{
|
||||||
|
return JsonStructSerializer(*this, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArraySerializer JsonSerializeHelper::enterArray(const std::string & fieldName)
|
||||||
|
{
|
||||||
|
return JsonArraySerializer(*this, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//JsonStructSerializer
|
||||||
|
JsonStructSerializer::JsonStructSerializer(JsonStructSerializer && other):
|
||||||
|
JsonSerializeHelper(std::move(static_cast<JsonSerializeHelper &>(other))),
|
||||||
|
optional(other.optional)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonStructSerializer::JsonStructSerializer(JsonSerializeFormat & owner_, const std::string & fieldName):
|
||||||
|
JsonSerializeHelper(owner_, &(owner_.current->operator[](fieldName))),
|
||||||
|
optional(false)
|
||||||
|
{
|
||||||
|
if(owner.saving)
|
||||||
|
thisNode->setType(JsonNode::DATA_STRUCT);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonStructSerializer::JsonStructSerializer(JsonSerializeHelper & parent, const std::string & fieldName):
|
||||||
|
JsonSerializeHelper(parent, fieldName),
|
||||||
|
optional(false)
|
||||||
|
{
|
||||||
|
if(owner.saving)
|
||||||
|
thisNode->setType(JsonNode::DATA_STRUCT);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonStructSerializer::JsonStructSerializer(JsonSerializeFormat & owner_, JsonNode * thisNode_):
|
||||||
|
JsonSerializeHelper(owner_, thisNode_),
|
||||||
|
optional(false)
|
||||||
|
{
|
||||||
|
if(owner.saving)
|
||||||
|
thisNode->setType(JsonNode::DATA_STRUCT);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonStructSerializer::~JsonStructSerializer()
|
||||||
|
{
|
||||||
|
//todo: delete empty optional node
|
||||||
|
if(owner.saving && optional && thisNode->Struct().empty())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//JsonArraySerializer
|
||||||
|
JsonArraySerializer::JsonArraySerializer(JsonStructSerializer && other):
|
||||||
|
JsonSerializeHelper(std::move(static_cast<JsonSerializeHelper &>(other)))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArraySerializer::JsonArraySerializer(JsonSerializeFormat & owner_, const std::string & fieldName):
|
||||||
|
JsonSerializeHelper(owner_, &(owner_.current->operator[](fieldName)))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArraySerializer::JsonArraySerializer(JsonSerializeHelper & parent, const std::string & fieldName):
|
||||||
|
JsonSerializeHelper(parent, fieldName)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonStructSerializer JsonArraySerializer::enterStruct(const size_t index)
|
||||||
|
{
|
||||||
|
return JsonStructSerializer(owner, &(thisNode->Vector()[index]));
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonArraySerializer::resize(const size_t newSize)
|
||||||
|
{
|
||||||
|
thisNode->Vector().resize(newSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonArraySerializer::resize(const size_t newSize, JsonNode::JsonType type)
|
||||||
|
{
|
||||||
|
resize(newSize);
|
||||||
|
|
||||||
|
for(JsonNode & n : thisNode->Vector())
|
||||||
|
if(n.getType() == JsonNode::DATA_NULL)
|
||||||
|
n.setType(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t JsonArraySerializer::size() const
|
||||||
|
{
|
||||||
|
return thisNode->Vector().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
//JsonSerializeFormat::LIC
|
||||||
|
JsonSerializeFormat::LIC::LIC(const std::vector<bool> & Standard, const TDecoder Decoder, const TEncoder Encoder):
|
||||||
standard(Standard), decoder(Decoder), encoder(Encoder)
|
standard(Standard), decoder(Decoder), encoder(Encoder)
|
||||||
{
|
{
|
||||||
any.resize(standard.size(), false);
|
any.resize(standard.size(), false);
|
||||||
@ -72,19 +162,33 @@ JsonSerializeFormat::LIC::LIC(const std::vector<bool> & Standard, const TDecoder
|
|||||||
none.resize(standard.size(), false);
|
none.resize(standard.size(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JsonSerializeFormat::LICSet::LICSet(const std::set<si32>& Standard, const TDecoder Decoder, const TEncoder Encoder):
|
||||||
|
standard(Standard), decoder(Decoder), encoder(Encoder)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//JsonSerializeFormat
|
//JsonSerializeFormat
|
||||||
JsonSerializeFormat::JsonSerializeFormat(JsonNode & root_, const bool saving_):
|
JsonSerializeFormat::JsonSerializeFormat(const IInstanceResolver * instanceResolver_, JsonNode & root_, const bool saving_):
|
||||||
saving(saving_),
|
saving(saving_),
|
||||||
root(&root_),
|
root(&root_),
|
||||||
current(root)
|
current(root),
|
||||||
|
instanceResolver(instanceResolver_)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonStructSerializer JsonSerializeFormat::enterStruct(const std::string & fieldName)
|
JsonStructSerializer JsonSerializeFormat::enterStruct(const std::string & fieldName)
|
||||||
{
|
{
|
||||||
JsonStructSerializer res(*this, fieldName);
|
return JsonStructSerializer(*this, fieldName);
|
||||||
|
}
|
||||||
return res;
|
|
||||||
|
JsonArraySerializer JsonSerializeFormat::enterArray(const std::string & fieldName)
|
||||||
|
{
|
||||||
|
return JsonArraySerializer(*this, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializeFormat::serializeBool(const std::string & fieldName, bool & value)
|
||||||
|
{
|
||||||
|
serializeBool<bool>(fieldName, value, true, false, false);
|
||||||
}
|
}
|
||||||
|
@ -10,30 +10,96 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class JsonNode;
|
#include "../JsonNode.h"
|
||||||
|
|
||||||
class JsonSerializeFormat;
|
class JsonSerializeFormat;
|
||||||
|
class JsonStructSerializer;
|
||||||
|
class JsonArraySerializer;
|
||||||
|
|
||||||
class JsonStructSerializer: public boost::noncopyable
|
class IInstanceResolver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
JsonStructSerializer(JsonStructSerializer && other);
|
virtual ~IInstanceResolver(){};
|
||||||
virtual ~JsonStructSerializer();
|
virtual si32 decode(const std::string & identifier) const = 0;
|
||||||
|
virtual std::string encode(si32 identifier) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
JsonStructSerializer enterStruct(const std::string & fieldName);
|
class JsonSerializeHelper: public boost::noncopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
JsonSerializeHelper(JsonSerializeHelper && other);
|
||||||
|
virtual ~JsonSerializeHelper();
|
||||||
|
|
||||||
JsonNode & get();
|
JsonNode & get();
|
||||||
|
|
||||||
JsonSerializeFormat * operator->();
|
JsonSerializeFormat * operator->();
|
||||||
private:
|
|
||||||
JsonStructSerializer(JsonSerializeFormat & owner_, const std::string & fieldName);
|
|
||||||
JsonStructSerializer(JsonStructSerializer & parent, const std::string & fieldName);
|
|
||||||
|
|
||||||
bool restoreState;
|
JsonStructSerializer enterStruct(const std::string & fieldName);
|
||||||
|
JsonArraySerializer enterArray(const std::string & fieldName);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
JsonSerializeHelper(JsonSerializeFormat & owner_, JsonNode * thisNode_);
|
||||||
|
JsonSerializeHelper(JsonSerializeHelper & parent, const std::string & fieldName);
|
||||||
|
|
||||||
JsonSerializeFormat & owner;
|
JsonSerializeFormat & owner;
|
||||||
JsonNode * parentNode;
|
|
||||||
JsonNode * thisNode;
|
JsonNode * thisNode;
|
||||||
|
JsonNode * parentNode;
|
||||||
|
|
||||||
|
friend class JsonStructSerializer;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool restoreState;
|
||||||
|
};
|
||||||
|
|
||||||
|
class JsonStructSerializer: public JsonSerializeHelper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool optional;
|
||||||
|
JsonStructSerializer(JsonStructSerializer && other);
|
||||||
|
~JsonStructSerializer();
|
||||||
|
protected:
|
||||||
|
JsonStructSerializer(JsonSerializeFormat & owner_, JsonNode * thisNode_);
|
||||||
|
JsonStructSerializer(JsonSerializeFormat & owner_, const std::string & fieldName);
|
||||||
|
JsonStructSerializer(JsonSerializeHelper & parent, const std::string & fieldName);
|
||||||
|
|
||||||
friend class JsonSerializeFormat;
|
friend class JsonSerializeFormat;
|
||||||
|
friend class JsonSerializeHelper;
|
||||||
|
friend class JsonArraySerializer;
|
||||||
|
};
|
||||||
|
|
||||||
|
class JsonArraySerializer: public JsonSerializeHelper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
JsonArraySerializer(JsonStructSerializer && other);
|
||||||
|
|
||||||
|
JsonStructSerializer enterStruct(const size_t index);
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void syncSize(Container & c, JsonNode::JsonType type = JsonNode::DATA_NULL);
|
||||||
|
|
||||||
|
///vector of serializable <-> Json vector of structs
|
||||||
|
template <typename Element>
|
||||||
|
void serializeStruct(std::vector<Element> & value)
|
||||||
|
{
|
||||||
|
syncSize(value, JsonNode::DATA_STRUCT);
|
||||||
|
|
||||||
|
for(size_t idx = 0; idx < size(); idx++)
|
||||||
|
{
|
||||||
|
auto s = enterStruct(idx);
|
||||||
|
value[idx].serializeJson(owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void resize(const size_t newSize);
|
||||||
|
void resize(const size_t newSize, JsonNode::JsonType type);
|
||||||
|
size_t size() const;
|
||||||
|
protected:
|
||||||
|
JsonArraySerializer(JsonSerializeFormat & owner_, const std::string & fieldName);
|
||||||
|
JsonArraySerializer(JsonSerializeHelper & parent, const std::string & fieldName);
|
||||||
|
|
||||||
|
friend class JsonSerializeFormat;
|
||||||
|
friend class JsonSerializeHelper;
|
||||||
};
|
};
|
||||||
|
|
||||||
class JsonSerializeFormat: public boost::noncopyable
|
class JsonSerializeFormat: public boost::noncopyable
|
||||||
@ -47,16 +113,28 @@ public:
|
|||||||
///may assume that object index is valid
|
///may assume that object index is valid
|
||||||
typedef std::function<std::string(si32)> TEncoder;
|
typedef std::function<std::string(si32)> TEncoder;
|
||||||
|
|
||||||
|
typedef std::function<void(JsonSerializeFormat &)> TSerialize;
|
||||||
|
|
||||||
struct LIC
|
struct LIC
|
||||||
{
|
{
|
||||||
LIC(const std::vector<bool> & Standard, const TDecoder & Decoder, const TEncoder & Encoder);
|
LIC(const std::vector<bool> & Standard, const TDecoder Decoder, const TEncoder Encoder);
|
||||||
|
|
||||||
const std::vector<bool> & standard;
|
const std::vector<bool> & standard;
|
||||||
const TDecoder & decoder;
|
const TDecoder decoder;
|
||||||
const TEncoder & encoder;
|
const TEncoder encoder;
|
||||||
std::vector<bool> all, any, none;
|
std::vector<bool> all, any, none;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct LICSet
|
||||||
|
{
|
||||||
|
LICSet(const std::set<si32> & Standard, const TDecoder Decoder, const TEncoder Encoder);
|
||||||
|
|
||||||
|
const std::set<si32> & standard;
|
||||||
|
const TDecoder decoder;
|
||||||
|
const TEncoder encoder;
|
||||||
|
std::set<si32> all, any, none;
|
||||||
|
};
|
||||||
|
|
||||||
const bool saving;
|
const bool saving;
|
||||||
|
|
||||||
JsonSerializeFormat() = delete;
|
JsonSerializeFormat() = delete;
|
||||||
@ -73,19 +151,39 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
JsonStructSerializer enterStruct(const std::string & fieldName);
|
JsonStructSerializer enterStruct(const std::string & fieldName);
|
||||||
|
JsonArraySerializer enterArray(const std::string & fieldName);
|
||||||
|
|
||||||
|
///Anything comparable <-> Json bool
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void serializeBool(const std::string & fieldName, const T trueValue, const T falseValue, T & value)
|
void serializeBool(const std::string & fieldName, T & value, const T trueValue, const T falseValue, const T defaultValue)
|
||||||
{
|
{
|
||||||
bool temp = (value == trueValue);
|
boost::logic::tribool temp(boost::logic::indeterminate);
|
||||||
serializeBool(fieldName, temp);
|
|
||||||
|
if(value == defaultValue)
|
||||||
|
;//leave as indeterminate
|
||||||
|
else if(value == trueValue)
|
||||||
|
temp = true;
|
||||||
|
else if(value == falseValue)
|
||||||
|
temp = false;
|
||||||
|
|
||||||
|
serializeInternal(fieldName, temp);
|
||||||
if(!saving)
|
if(!saving)
|
||||||
value = temp ? trueValue : falseValue;
|
{
|
||||||
|
if(boost::logic::indeterminate(temp))
|
||||||
|
value = defaultValue;
|
||||||
|
else
|
||||||
|
value = temp ? trueValue : falseValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void serializeBool(const std::string & fieldName, bool & value) = 0;
|
///bool <-> Json bool
|
||||||
|
void serializeBool(const std::string & fieldName, bool & value);
|
||||||
|
|
||||||
virtual void serializeEnum(const std::string & fieldName, const std::string & trueValue, const std::string & falseValue, bool & value) = 0;
|
///tribool <-> Json bool
|
||||||
|
void serializeBool(const std::string & fieldName, boost::logic::tribool & value)
|
||||||
|
{
|
||||||
|
serializeInternal(fieldName, value);
|
||||||
|
};
|
||||||
|
|
||||||
/** @brief Restrictive ("anyOf") simple serialization of Logical identifier condition, simple deserialization (allOf=anyOf)
|
/** @brief Restrictive ("anyOf") simple serialization of Logical identifier condition, simple deserialization (allOf=anyOf)
|
||||||
*
|
*
|
||||||
@ -101,48 +199,225 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void serializeLIC(const std::string & fieldName, LIC & value) = 0;
|
virtual void serializeLIC(const std::string & fieldName, LIC & value) = 0;
|
||||||
|
|
||||||
template <typename T>
|
/** @brief Complete serialization of Logical identifier condition. (Special version)
|
||||||
void serializeNumericEnum(const std::string & fieldName, const std::vector<std::string> & enumMap, const T defaultValue, T & value)
|
* Assumes that all values are allowed by default, and standard contains them
|
||||||
{
|
*/
|
||||||
si32 temp = value;
|
virtual void serializeLIC(const std::string & fieldName, LICSet & value) = 0;
|
||||||
serializeIntEnum(fieldName, enumMap, defaultValue, temp);
|
|
||||||
if(!saving)
|
|
||||||
value = temp;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void serializeNumeric(const std::string & fieldName, T & value)
|
|
||||||
{
|
|
||||||
double temp = value;
|
|
||||||
serializeFloat(fieldName, temp);
|
|
||||||
if(!saving)
|
|
||||||
value = temp;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
///String <-> Json string
|
||||||
virtual void serializeString(const std::string & fieldName, std::string & value) = 0;
|
virtual void serializeString(const std::string & fieldName, std::string & value) = 0;
|
||||||
|
|
||||||
|
///si32-convertible enum <-> Json string enum
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void serializeId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const T & defaultValue, T & value)
|
void serializeEnum(const std::string & fieldName, T & value, const std::vector<std::string> & enumMap)
|
||||||
{
|
{
|
||||||
const si32 tempDefault = defaultValue.num;
|
doSerializeInternal<T, T, si32>(fieldName, value, boost::none, enumMap);
|
||||||
si32 tempValue = value.num;
|
};
|
||||||
serializeIntId(fieldName, decoder, encoder, tempDefault, tempValue);
|
|
||||||
|
///si32-convertible enum <-> Json string enum
|
||||||
|
template <typename T, typename U>
|
||||||
|
void serializeEnum(const std::string & fieldName, T & value, const U & defaultValue, const std::vector<std::string> & enumMap)
|
||||||
|
{
|
||||||
|
doSerializeInternal<T, U, si32>(fieldName, value, defaultValue, enumMap);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename U, typename C>
|
||||||
|
void serializeEnum(const std::string & fieldName, T & value, const U & defaultValue, const C & enumMap)
|
||||||
|
{
|
||||||
|
std::vector<std::string> enumMapCopy;
|
||||||
|
|
||||||
|
std::copy(std::begin(enumMap), std::end(enumMap), std::back_inserter(enumMapCopy));
|
||||||
|
|
||||||
|
doSerializeInternal<T, U, si32>(fieldName, value, defaultValue, enumMapCopy);
|
||||||
|
};
|
||||||
|
|
||||||
|
///Anything double-convertible <-> Json double
|
||||||
|
template <typename T>
|
||||||
|
void serializeFloat(const std::string & fieldName, T & value)
|
||||||
|
{
|
||||||
|
doSerializeInternal<T, T, double>(fieldName, value, boost::none);
|
||||||
|
};
|
||||||
|
|
||||||
|
///Anything double-convertible <-> Json double
|
||||||
|
template <typename T, typename U>
|
||||||
|
void serializeFloat(const std::string & fieldName, T & value, const U & defaultValue)
|
||||||
|
{
|
||||||
|
doSerializeInternal<T, U, double>(fieldName, value, defaultValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
///Anything int64-convertible <-> Json integer
|
||||||
|
template <typename T>
|
||||||
|
void serializeInt(const std::string & fieldName, T & value)
|
||||||
|
{
|
||||||
|
doSerializeInternal<T, T, si64>(fieldName, value, boost::none);
|
||||||
|
};
|
||||||
|
|
||||||
|
///Anything int64-convertible <-> Json integer
|
||||||
|
template <typename T, typename U>
|
||||||
|
void serializeInt(const std::string & fieldName, T & value, const U & defaultValue)
|
||||||
|
{
|
||||||
|
doSerializeInternal<T, U, si64>(fieldName, value, defaultValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
///si32-convertible identifier <-> Json string
|
||||||
|
template <typename T, typename U>
|
||||||
|
void serializeId(const std::string & fieldName, T & value, const U & defaultValue, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
|
{
|
||||||
|
doSerializeInternal<T, U, si32>(fieldName, value, defaultValue, decoder, encoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
///si32-convertible identifier vector <-> Json array of string
|
||||||
|
template <typename T>
|
||||||
|
void serializeIdArray(const std::string & fieldName, std::vector<T> & value, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
|
{
|
||||||
|
std::vector<si32> temp;
|
||||||
|
|
||||||
|
if(saving)
|
||||||
|
{
|
||||||
|
temp.reserve(value.size());
|
||||||
|
|
||||||
|
for(const T & vitem : value)
|
||||||
|
{
|
||||||
|
si32 item = static_cast<si32>(vitem);
|
||||||
|
temp.push_back(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
serializeInternal(fieldName, temp, decoder, encoder);
|
||||||
if(!saving)
|
if(!saving)
|
||||||
value = T(tempValue);
|
{
|
||||||
|
value.clear();
|
||||||
|
value.reserve(temp.size());
|
||||||
|
|
||||||
|
for(const si32 item : temp)
|
||||||
|
{
|
||||||
|
T vitem = static_cast<T>(item);
|
||||||
|
value.push_back(vitem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///si32-convertible identifier set <-> Json array of string
|
||||||
|
template <typename T>
|
||||||
|
void serializeIdArray(const std::string & fieldName, std::set<T> & value, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
|
{
|
||||||
|
std::vector<si32> temp;
|
||||||
|
|
||||||
|
if(saving)
|
||||||
|
{
|
||||||
|
temp.reserve(value.size());
|
||||||
|
|
||||||
|
for(const T & vitem : value)
|
||||||
|
{
|
||||||
|
si32 item = static_cast<si32>(vitem);
|
||||||
|
temp.push_back(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
serializeInternal(fieldName, temp, decoder, encoder);
|
||||||
|
if(!saving)
|
||||||
|
{
|
||||||
|
value.clear();
|
||||||
|
|
||||||
|
for(const si32 item : temp)
|
||||||
|
{
|
||||||
|
T vitem = static_cast<T>(item);
|
||||||
|
value.insert(vitem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///bitmask <-> Json array of string
|
||||||
|
template <typename T, int Size>
|
||||||
|
void serializeIdArray(const std::string & fieldName, T & value, const T & defaultValue, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
|
{
|
||||||
|
static_assert(8 * sizeof(T) >= Size, "Mask size too small");
|
||||||
|
|
||||||
|
std::vector<si32> temp;
|
||||||
|
temp.reserve(Size);
|
||||||
|
|
||||||
|
if(saving && value != defaultValue)
|
||||||
|
{
|
||||||
|
for(si32 i = 0; i < Size; i++)
|
||||||
|
if(value & (1 << i))
|
||||||
|
temp.push_back(i);
|
||||||
|
serializeInternal(fieldName, temp, decoder, encoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!saving)
|
||||||
|
{
|
||||||
|
serializeInternal(fieldName, temp, decoder, encoder);
|
||||||
|
|
||||||
|
if(temp.empty())
|
||||||
|
value = defaultValue;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = 0;
|
||||||
|
for(auto i : temp)
|
||||||
|
value |= (1 << i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///si32-convertible instance identifier <-> Json string
|
||||||
|
template <typename T>
|
||||||
|
void serializeInstance(const std::string & fieldName, T & value, const T & defaultValue)
|
||||||
|
{
|
||||||
|
const TDecoder decoder = std::bind(&IInstanceResolver::decode, instanceResolver, _1);
|
||||||
|
const TEncoder endoder = std::bind(&IInstanceResolver::encode, instanceResolver, _1);
|
||||||
|
|
||||||
|
serializeId<T>(fieldName, value, defaultValue, decoder, endoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
JsonNode * root;
|
JsonNode * root;
|
||||||
JsonNode * current;
|
JsonNode * current;
|
||||||
|
|
||||||
JsonSerializeFormat(JsonNode & root_, const bool saving_);
|
JsonSerializeFormat(const IInstanceResolver * instanceResolver_, JsonNode & root_, const bool saving_);
|
||||||
|
|
||||||
virtual void serializeFloat(const std::string & fieldName, double & value) = 0;
|
///bool <-> Json bool, indeterminate is default
|
||||||
|
virtual void serializeInternal(const std::string & fieldName, boost::logic::tribool & value) = 0;
|
||||||
|
|
||||||
virtual void serializeIntEnum(const std::string & fieldName, const std::vector<std::string> & enumMap, const si32 defaultValue, si32 & value) = 0;
|
///Numeric Id <-> String Id
|
||||||
|
virtual void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const TDecoder & decoder, const TEncoder & encoder) = 0;
|
||||||
|
|
||||||
|
///Numeric Id vector <-> String Id vector
|
||||||
|
virtual void serializeInternal(const std::string & fieldName, std::vector<si32> & value, const TDecoder & decoder, const TEncoder & encoder) = 0;
|
||||||
|
|
||||||
|
///Numeric <-> Json double
|
||||||
|
virtual void serializeInternal(const std::string & fieldName, double & value, const boost::optional<double> & defaultValue) = 0;
|
||||||
|
|
||||||
|
///Numeric <-> Json integer
|
||||||
|
virtual void serializeInternal(const std::string & fieldName, si64 & value, const boost::optional<si64> & defaultValue) = 0;
|
||||||
|
|
||||||
|
///Enum/Numeric <-> Json string enum
|
||||||
|
virtual void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const std::vector<std::string> & enumMap) = 0;
|
||||||
|
|
||||||
virtual void serializeIntId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const si32 defaultValue, si32 & value) = 0;
|
|
||||||
private:
|
private:
|
||||||
|
const IInstanceResolver * instanceResolver;
|
||||||
|
|
||||||
|
template <typename VType, typename DVType, typename IType, typename... Args>
|
||||||
|
void doSerializeInternal(const std::string & fieldName, VType & value, const boost::optional<DVType> & defaultValue, Args ... args)
|
||||||
|
{
|
||||||
|
const boost::optional<IType> tempDefault = defaultValue ? boost::optional<IType>(static_cast<IType>(defaultValue.get())) : boost::none;
|
||||||
|
IType temp = static_cast<IType>(value);
|
||||||
|
|
||||||
|
serializeInternal(fieldName, temp, tempDefault, args...);
|
||||||
|
|
||||||
|
if(!saving)
|
||||||
|
value = static_cast<VType>(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend class JsonSerializeHelper;
|
||||||
friend class JsonStructSerializer;
|
friend class JsonStructSerializer;
|
||||||
|
friend class JsonArraySerializer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
void JsonArraySerializer::syncSize(Container & c, JsonNode::JsonType type)
|
||||||
|
{
|
||||||
|
if(owner.saving)
|
||||||
|
resize(c.size(), type);
|
||||||
|
else
|
||||||
|
c.resize(size());
|
||||||
|
}
|
||||||
|
@ -14,44 +14,61 @@
|
|||||||
|
|
||||||
#include "../JsonNode.h"
|
#include "../JsonNode.h"
|
||||||
|
|
||||||
JsonSerializer::JsonSerializer(JsonNode & root_):
|
JsonSerializer::JsonSerializer(const IInstanceResolver * instanceResolver_, JsonNode & root_):
|
||||||
JsonSerializeFormat(root_, true)
|
JsonSerializeFormat(instanceResolver_, root_, true)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonSerializer::serializeBool(const std::string & fieldName, bool & value)
|
void JsonSerializer::serializeInternal(const std::string & fieldName, boost::logic::tribool & value)
|
||||||
{
|
{
|
||||||
if(value)
|
if(!boost::logic::indeterminate(value))
|
||||||
current->operator[](fieldName).Bool() = true;
|
current->operator[](fieldName).Bool() = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonSerializer::serializeEnum(const std::string & fieldName, const std::string & trueValue, const std::string & falseValue, bool & value)
|
void JsonSerializer::serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
{
|
{
|
||||||
current->operator[](fieldName).String() = value ? trueValue : falseValue;
|
if(!defaultValue || defaultValue.get() != value)
|
||||||
}
|
|
||||||
|
|
||||||
void JsonSerializer::serializeFloat(const std::string & fieldName, double & value)
|
|
||||||
{
|
|
||||||
if(value != 0)
|
|
||||||
current->operator[](fieldName).Float() = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonSerializer::serializeIntEnum(const std::string & fieldName, const std::vector<std::string> & enumMap, const si32 defaultValue, si32 & value)
|
|
||||||
{
|
|
||||||
if(defaultValue != value)
|
|
||||||
current->operator[](fieldName).String() = enumMap.at(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonSerializer::serializeIntId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const si32 defaultValue, si32 & value)
|
|
||||||
{
|
|
||||||
if(defaultValue != value)
|
|
||||||
{
|
{
|
||||||
std::string identifier = encoder(value);
|
std::string identifier = encoder(value);
|
||||||
serializeString(fieldName, identifier);
|
serializeString(fieldName, identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::serializeInternal(const std::string & fieldName, double & value, const boost::optional<double> & defaultValue)
|
||||||
|
{
|
||||||
|
if(!defaultValue || defaultValue.get() != value)
|
||||||
|
current->operator[](fieldName).Float() = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::serializeInternal(const std::string & fieldName, si64 & value, const boost::optional<si64> & defaultValue)
|
||||||
|
{
|
||||||
|
if(!defaultValue || defaultValue.get() != value)
|
||||||
|
current->operator[](fieldName).Integer() = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const std::vector<std::string> & enumMap)
|
||||||
|
{
|
||||||
|
if(!defaultValue || defaultValue.get() != value)
|
||||||
|
current->operator[](fieldName).String() = enumMap.at(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::serializeInternal(const std::string & fieldName, std::vector<si32> & value, const TDecoder & decoder, const TEncoder & encoder)
|
||||||
|
{
|
||||||
|
if(value.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
JsonVector & data = current->operator[](fieldName).Vector();
|
||||||
|
data.reserve(value.size());
|
||||||
|
|
||||||
|
for(const si32 rawId : value)
|
||||||
|
{
|
||||||
|
JsonNode jsonElement(JsonNode::DATA_STRING);
|
||||||
|
jsonElement.String() = encoder(rawId);
|
||||||
|
data.push_back(std::move(jsonElement));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JsonSerializer::serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value)
|
void JsonSerializer::serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value)
|
||||||
{
|
{
|
||||||
assert(standard.size() == value.size());
|
assert(standard.size() == value.size());
|
||||||
@ -64,9 +81,16 @@ void JsonSerializer::serializeLIC(const std::string & fieldName, const TDecoder
|
|||||||
void JsonSerializer::serializeLIC(const std::string & fieldName, LIC & value)
|
void JsonSerializer::serializeLIC(const std::string & fieldName, LIC & value)
|
||||||
{
|
{
|
||||||
if(value.any != value.standard)
|
if(value.any != value.standard)
|
||||||
{
|
|
||||||
writeLICPart(fieldName, "anyOf", value.encoder, value.any);
|
writeLICPart(fieldName, "anyOf", value.encoder, value.any);
|
||||||
}
|
|
||||||
|
writeLICPart(fieldName, "allOf", value.encoder, value.all);
|
||||||
|
writeLICPart(fieldName, "noneOf", value.encoder, value.none);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::serializeLIC(const std::string & fieldName, LICSet & value)
|
||||||
|
{
|
||||||
|
if(value.any != value.standard)
|
||||||
|
writeLICPart(fieldName, "anyOf", value.encoder, value.any);
|
||||||
|
|
||||||
writeLICPart(fieldName, "allOf", value.encoder, value.all);
|
writeLICPart(fieldName, "allOf", value.encoder, value.all);
|
||||||
writeLICPart(fieldName, "noneOf", value.encoder, value.none);
|
writeLICPart(fieldName, "noneOf", value.encoder, value.none);
|
||||||
@ -78,15 +102,41 @@ void JsonSerializer::serializeString(const std::string & fieldName, std::string
|
|||||||
current->operator[](fieldName).String() = value;
|
current->operator[](fieldName).String() = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonSerializer::writeLICPart(const std::string& fieldName, const std::string& partName, const TEncoder& encoder, const std::vector<bool> & data)
|
void JsonSerializer::writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::vector<bool> & data)
|
||||||
{
|
{
|
||||||
auto & target = current->operator[](fieldName)[partName].Vector();
|
std::vector<std::string> buf;
|
||||||
for(si32 idx = 0; idx < data.size(); idx ++)
|
buf.reserve(data.size());
|
||||||
{
|
|
||||||
|
for(si32 idx = 0; idx < data.size(); idx++)
|
||||||
if(data[idx])
|
if(data[idx])
|
||||||
|
buf.push_back(encoder(idx));
|
||||||
|
|
||||||
|
writeLICPartBuffer(fieldName, partName, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::set<si32> & data)
|
||||||
|
{
|
||||||
|
std::vector<std::string> buf;
|
||||||
|
buf.reserve(data.size());
|
||||||
|
|
||||||
|
for(const si32 item : data)
|
||||||
|
buf.push_back(encoder(item));
|
||||||
|
|
||||||
|
writeLICPartBuffer(fieldName, partName, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonSerializer::writeLICPartBuffer(const std::string & fieldName, const std::string & partName, std::vector<std::string> & buffer)
|
||||||
|
{
|
||||||
|
if(!buffer.empty())
|
||||||
|
{
|
||||||
|
std::sort(buffer.begin(), buffer.end());
|
||||||
|
|
||||||
|
auto & target = current->operator[](fieldName)[partName].Vector();
|
||||||
|
|
||||||
|
for(auto & s : buffer)
|
||||||
{
|
{
|
||||||
JsonNode val(JsonNode::DATA_STRING);
|
JsonNode val(JsonNode::DATA_STRING);
|
||||||
val.String() = encoder(idx);
|
std::swap(val.String(), s);
|
||||||
target.push_back(std::move(val));
|
target.push_back(std::move(val));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,19 +17,23 @@ class JsonNode;
|
|||||||
class JsonSerializer: public JsonSerializeFormat
|
class JsonSerializer: public JsonSerializeFormat
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
JsonSerializer(JsonNode & root_);
|
JsonSerializer(const IInstanceResolver * instanceResolver_, JsonNode & root_);
|
||||||
|
|
||||||
void serializeBool(const std::string & fieldName, bool & value) override;
|
|
||||||
void serializeEnum(const std::string & fieldName, const std::string & trueValue, const std::string & falseValue, bool & value) override;
|
|
||||||
void serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value) override;
|
void serializeLIC(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const std::vector<bool> & standard, std::vector<bool> & value) override;
|
||||||
void serializeLIC(const std::string & fieldName, LIC & value) override;
|
void serializeLIC(const std::string & fieldName, LIC & value) override;
|
||||||
|
void serializeLIC(const std::string & fieldName, LICSet & value) override;
|
||||||
void serializeString(const std::string & fieldName, std::string & value) override;
|
void serializeString(const std::string & fieldName, std::string & value) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void serializeFloat(const std::string & fieldName, double & value) override;
|
void serializeInternal(const std::string & fieldName, boost::logic::tribool & value) override;
|
||||||
void serializeIntEnum(const std::string & fieldName, const std::vector<std::string> & enumMap, const si32 defaultValue, si32 & value) override;
|
void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const TDecoder & decoder, const TEncoder & encoder) override;
|
||||||
void serializeIntId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const si32 defaultValue, si32 & value) override;
|
void serializeInternal(const std::string & fieldName, std::vector<si32> & value, const TDecoder & decoder, const TEncoder & encoder) override;
|
||||||
|
void serializeInternal(const std::string & fieldName, double & value, const boost::optional<double> & defaultValue) override;
|
||||||
|
void serializeInternal(const std::string & fieldName, si64 & value, const boost::optional<si64> & defaultValue) override;
|
||||||
|
void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional<si32> & defaultValue, const std::vector<std::string> & enumMap) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::vector<bool> & data);
|
void writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::vector<bool> & data);
|
||||||
|
void writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::set<si32> & data);
|
||||||
|
void writeLICPartBuffer(const std::string & fieldName, const std::string & partName, std::vector<std::string> & buffer);
|
||||||
};
|
};
|
||||||
|
@ -925,7 +925,7 @@ CSpell * CSpellHandler::loadFromJson(const JsonNode & json, const std::string &
|
|||||||
if("bottom" == vPosStr)
|
if("bottom" == vPosStr)
|
||||||
newItem.verticalPosition = VerticalPosition::BOTTOM;
|
newItem.verticalPosition = VerticalPosition::BOTTOM;
|
||||||
}
|
}
|
||||||
else if(item.getType() == JsonNode::DATA_FLOAT)
|
else if(item.isNumber())
|
||||||
{
|
{
|
||||||
newItem.pause = item.Float();
|
newItem.pause = item.Float();
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,12 @@ cotire(vcmitest)
|
|||||||
# Files to copy to the build directory
|
# Files to copy to the build directory
|
||||||
add_custom_target(vcmitestFiles ALL)
|
add_custom_target(vcmitestFiles ALL)
|
||||||
set(vcmitest_FILES
|
set(vcmitest_FILES
|
||||||
TerrainViewTest.h3m
|
testdata/TerrainViewTest.h3m
|
||||||
terrainViewMappings.json
|
testdata/terrainViewMappings.json
|
||||||
|
testdata/ObjectPropertyTest/header.json
|
||||||
|
testdata/ObjectPropertyTest/objects.json
|
||||||
|
testdata/ObjectPropertyTest/surface_terrain.json
|
||||||
|
testdata/ObjectPropertyTest/underground_terrain.json
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(file ${vcmitest_FILES})
|
foreach(file ${vcmitest_FILES})
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
#include "../lib/filesystem/CMemoryBuffer.h"
|
#include "../lib/filesystem/CMemoryBuffer.h"
|
||||||
|
#include "../lib/filesystem/Filesystem.h"
|
||||||
|
|
||||||
#include "../lib/mapping/CMap.h"
|
#include "../lib/mapping/CMap.h"
|
||||||
#include "../lib/rmg/CMapGenOptions.h"
|
#include "../lib/rmg/CMapGenOptions.h"
|
||||||
@ -23,54 +24,41 @@
|
|||||||
|
|
||||||
#include "MapComparer.h"
|
#include "MapComparer.h"
|
||||||
|
|
||||||
|
|
||||||
static const int TEST_RANDOM_SEED = 1337;
|
static const int TEST_RANDOM_SEED = 1337;
|
||||||
|
|
||||||
static std::unique_ptr<CMap> initialMap;
|
BOOST_AUTO_TEST_CASE(MapFormat_Random)
|
||||||
|
|
||||||
class CMapTestFixture
|
|
||||||
{
|
{
|
||||||
public:
|
logGlobal->info("MapFormat_Random start");
|
||||||
CMapTestFixture()
|
BOOST_TEST_CHECKPOINT("MapFormat_Random start");
|
||||||
{
|
std::unique_ptr<CMap> initialMap;
|
||||||
CMapGenOptions opt;
|
|
||||||
|
|
||||||
opt.setHeight(CMapHeader::MAP_SIZE_MIDDLE);
|
CMapGenOptions opt;
|
||||||
opt.setWidth(CMapHeader::MAP_SIZE_MIDDLE);
|
|
||||||
opt.setHasTwoLevels(true);
|
|
||||||
opt.setPlayerCount(4);
|
|
||||||
|
|
||||||
opt.setPlayerTypeForStandardPlayer(PlayerColor(0), EPlayerType::HUMAN);
|
opt.setHeight(CMapHeader::MAP_SIZE_MIDDLE);
|
||||||
opt.setPlayerTypeForStandardPlayer(PlayerColor(1), EPlayerType::AI);
|
opt.setWidth(CMapHeader::MAP_SIZE_MIDDLE);
|
||||||
opt.setPlayerTypeForStandardPlayer(PlayerColor(2), EPlayerType::AI);
|
opt.setHasTwoLevels(true);
|
||||||
opt.setPlayerTypeForStandardPlayer(PlayerColor(3), EPlayerType::AI);
|
opt.setPlayerCount(4);
|
||||||
|
|
||||||
CMapGenerator gen;
|
opt.setPlayerTypeForStandardPlayer(PlayerColor(0), EPlayerType::HUMAN);
|
||||||
|
opt.setPlayerTypeForStandardPlayer(PlayerColor(1), EPlayerType::AI);
|
||||||
|
opt.setPlayerTypeForStandardPlayer(PlayerColor(2), EPlayerType::AI);
|
||||||
|
opt.setPlayerTypeForStandardPlayer(PlayerColor(3), EPlayerType::AI);
|
||||||
|
|
||||||
initialMap = gen.generate(&opt, TEST_RANDOM_SEED);
|
CMapGenerator gen;
|
||||||
initialMap->name = "Test";
|
|
||||||
};
|
|
||||||
~CMapTestFixture()
|
|
||||||
{
|
|
||||||
initialMap.reset();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOST_GLOBAL_FIXTURE(CMapTestFixture);
|
initialMap = gen.generate(&opt, TEST_RANDOM_SEED);
|
||||||
|
initialMap->name = "Test";
|
||||||
|
BOOST_TEST_CHECKPOINT("MapFormat_Random generated");
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(CMapFormatVCMI_Simple)
|
|
||||||
{
|
|
||||||
logGlobal->info("CMapFormatVCMI_Simple start");
|
|
||||||
BOOST_TEST_CHECKPOINT("CMapFormatVCMI_Simple start");
|
|
||||||
CMemoryBuffer serializeBuffer;
|
CMemoryBuffer serializeBuffer;
|
||||||
{
|
{
|
||||||
CMapSaverJson saver(&serializeBuffer);
|
CMapSaverJson saver(&serializeBuffer);
|
||||||
saver.saveMap(initialMap);
|
saver.saveMap(initialMap);
|
||||||
}
|
}
|
||||||
BOOST_TEST_CHECKPOINT("CMapFormatVCMI_Simple serialized");
|
BOOST_TEST_CHECKPOINT("MapFormat_Random serialized");
|
||||||
#if 1
|
#if 1
|
||||||
{
|
{
|
||||||
auto path = VCMIDirs::get().userDataPath()/"test.vmap";
|
auto path = VCMIDirs::get().userDataPath()/"test_random.vmap";
|
||||||
boost::filesystem::remove(path);
|
boost::filesystem::remove(path);
|
||||||
boost::filesystem::ofstream tmp(path, boost::filesystem::ofstream::binary);
|
boost::filesystem::ofstream tmp(path, boost::filesystem::ofstream::binary);
|
||||||
|
|
||||||
@ -81,7 +69,7 @@ BOOST_AUTO_TEST_CASE(CMapFormatVCMI_Simple)
|
|||||||
logGlobal->info("Test map has been saved to:");
|
logGlobal->info("Test map has been saved to:");
|
||||||
logGlobal->info(path.string());
|
logGlobal->info(path.string());
|
||||||
}
|
}
|
||||||
BOOST_TEST_CHECKPOINT("CMapFormatVCMI_Simple saved");
|
BOOST_TEST_CHECKPOINT("MapFormat_Random saved");
|
||||||
|
|
||||||
#endif // 1
|
#endif // 1
|
||||||
|
|
||||||
@ -94,5 +82,123 @@ BOOST_AUTO_TEST_CASE(CMapFormatVCMI_Simple)
|
|||||||
c(serialized, initialMap);
|
c(serialized, initialMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
logGlobal->info("CMapFormatVCMI_Simple finish");
|
logGlobal->info("MapFormat_Random finish");
|
||||||
|
}
|
||||||
|
|
||||||
|
static JsonNode getFromArchive(CZipLoader & archive, const std::string & archiveFilename)
|
||||||
|
{
|
||||||
|
ResourceID resource(archiveFilename, EResType::TEXT);
|
||||||
|
|
||||||
|
if(!archive.existsResource(resource))
|
||||||
|
throw new std::runtime_error(archiveFilename+" not found");
|
||||||
|
|
||||||
|
auto data = archive.load(resource)->readAll();
|
||||||
|
|
||||||
|
JsonNode res(reinterpret_cast<char*>(data.first.get()), data.second);
|
||||||
|
|
||||||
|
return std::move(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void addToArchive(CZipSaver & saver, const JsonNode & data, const std::string & filename)
|
||||||
|
{
|
||||||
|
std::ostringstream out;
|
||||||
|
out << data;
|
||||||
|
out.flush();
|
||||||
|
|
||||||
|
{
|
||||||
|
auto s = out.str();
|
||||||
|
std::unique_ptr<COutputStream> stream = saver.addFile(filename);
|
||||||
|
|
||||||
|
if(stream->write((const ui8*)s.c_str(), s.size()) != s.size())
|
||||||
|
throw new std::runtime_error("CMapSaverJson::saveHeader() zip compression failed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(MapFormat_Objects)
|
||||||
|
{
|
||||||
|
logGlobal->info("MapFormat_Objects start");
|
||||||
|
|
||||||
|
static const std::string MAP_DATA_PATH = "test/ObjectPropertyTest/";
|
||||||
|
|
||||||
|
const JsonNode initialHeader(ResourceID(MAP_DATA_PATH+"header.json"));
|
||||||
|
const JsonNode expectedHeader(ResourceID(MAP_DATA_PATH+"header.json"));//same as initial for now
|
||||||
|
|
||||||
|
const JsonNode initialObjects(ResourceID(MAP_DATA_PATH+"objects.json"));
|
||||||
|
const JsonNode expectedObjects(ResourceID(MAP_DATA_PATH+"objects.ex.json"));
|
||||||
|
|
||||||
|
const JsonNode expectedSurface(ResourceID(MAP_DATA_PATH+"surface_terrain.json"));
|
||||||
|
const JsonNode expectedUnderground(ResourceID(MAP_DATA_PATH+"underground_terrain.json"));
|
||||||
|
|
||||||
|
std::unique_ptr<CMap> originalMap;
|
||||||
|
{
|
||||||
|
CMemoryBuffer initialBuffer;
|
||||||
|
|
||||||
|
std::shared_ptr<CIOApi> originalDataIO(new CProxyIOApi(&initialBuffer));
|
||||||
|
|
||||||
|
{
|
||||||
|
CZipSaver initialSaver(originalDataIO, "_");
|
||||||
|
|
||||||
|
addToArchive(initialSaver, initialHeader, "header.json");
|
||||||
|
addToArchive(initialSaver, initialObjects, "objects.json");
|
||||||
|
addToArchive(initialSaver, expectedSurface, "surface_terrain.json");
|
||||||
|
addToArchive(initialSaver, expectedUnderground, "underground_terrain.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
initialBuffer.seek(0);
|
||||||
|
|
||||||
|
{
|
||||||
|
CMapLoaderJson initialLoader(&initialBuffer);
|
||||||
|
|
||||||
|
originalMap = initialLoader.loadMap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CMemoryBuffer serializeBuffer;
|
||||||
|
{
|
||||||
|
CMapSaverJson saver(&serializeBuffer);
|
||||||
|
saver.saveMap(originalMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<CIOApi> actualDataIO(new CProxyROIOApi(&serializeBuffer));
|
||||||
|
CZipLoader actualDataLoader("", "_", actualDataIO);
|
||||||
|
|
||||||
|
const JsonNode actualHeader = getFromArchive(actualDataLoader, "header.json");
|
||||||
|
const JsonNode actualObjects = getFromArchive(actualDataLoader, "objects.json");
|
||||||
|
const JsonNode actualSurface = getFromArchive(actualDataLoader, "surface_terrain.json");
|
||||||
|
const JsonNode actualUnderground = getFromArchive(actualDataLoader, "underground_terrain.json");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto path = VCMIDirs::get().userDataPath()/"test_object_property.vmap";
|
||||||
|
boost::filesystem::remove(path);
|
||||||
|
boost::filesystem::ofstream tmp(path, boost::filesystem::ofstream::binary);
|
||||||
|
|
||||||
|
tmp.write((const char *)serializeBuffer.getBuffer().data(),serializeBuffer.getSize());
|
||||||
|
tmp.flush();
|
||||||
|
tmp.close();
|
||||||
|
|
||||||
|
logGlobal->infoStream() << "Test map has been saved to " << path;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
JsonMapComparer c;
|
||||||
|
c.compareHeader(actualHeader, expectedHeader);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
JsonMapComparer c;
|
||||||
|
c.compareObjects(actualObjects, expectedObjects);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
JsonMapComparer c;
|
||||||
|
c.compareTerrain("surface", actualSurface, expectedSurface);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
JsonMapComparer c;
|
||||||
|
c.compareTerrain("underground", actualUnderground, expectedUnderground);
|
||||||
|
}
|
||||||
|
|
||||||
|
logGlobal->info("MapFormat_Objects finish");
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ CVcmiTestConfig::CVcmiTestConfig()
|
|||||||
|
|
||||||
/* TEST_DATA_DIR may be wrong, if yes below test don't run,
|
/* TEST_DATA_DIR may be wrong, if yes below test don't run,
|
||||||
find your test data folder in your build and change TEST_DATA_DIR for it*/
|
find your test data folder in your build and change TEST_DATA_DIR for it*/
|
||||||
const std::string TEST_DATA_DIR = "test/";
|
const std::string TEST_DATA_DIR = "test/testdata/";
|
||||||
auto path = boost::filesystem::current_path();
|
auto path = boost::filesystem::current_path();
|
||||||
path+= "/" + TEST_DATA_DIR;
|
path+= "/" + TEST_DATA_DIR;
|
||||||
if(boost::filesystem::exists(path)){
|
if(boost::filesystem::exists(path)){
|
||||||
|
@ -13,6 +13,9 @@
|
|||||||
|
|
||||||
#include "MapComparer.h"
|
#include "MapComparer.h"
|
||||||
|
|
||||||
|
#include "../lib/ScopeGuard.h"
|
||||||
|
#include "../lib/mapping/CMap.h"
|
||||||
|
|
||||||
#define VCMI_CHECK_FIELD_EQUAL_P(field) BOOST_CHECK_EQUAL(actual->field, expected->field)
|
#define VCMI_CHECK_FIELD_EQUAL_P(field) BOOST_CHECK_EQUAL(actual->field, expected->field)
|
||||||
|
|
||||||
#define VCMI_CHECK_FIELD_EQUAL(field) BOOST_CHECK_EQUAL(actual.field, expected.field)
|
#define VCMI_CHECK_FIELD_EQUAL(field) BOOST_CHECK_EQUAL(actual.field, expected.field)
|
||||||
@ -147,6 +150,7 @@ void checkEqual(const TerrainTile & actual, const TerrainTile & expected)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MapComparer
|
||||||
void MapComparer::compareHeader()
|
void MapComparer::compareHeader()
|
||||||
{
|
{
|
||||||
//map size parameters are vital for further checks
|
//map size parameters are vital for further checks
|
||||||
@ -192,7 +196,6 @@ void MapComparer::compareOptions()
|
|||||||
checkEqual(actual->allowedAbilities, expected->allowedAbilities);
|
checkEqual(actual->allowedAbilities, expected->allowedAbilities);
|
||||||
checkEqual(actual->allowedArtifact, expected->allowedArtifact);
|
checkEqual(actual->allowedArtifact, expected->allowedArtifact);
|
||||||
checkEqual(actual->allowedSpell, expected->allowedSpell);
|
checkEqual(actual->allowedSpell, expected->allowedSpell);
|
||||||
//checkEqual(actual->allowedAbilities, expected->allowedAbilities);
|
|
||||||
|
|
||||||
//todo: compareOptions events
|
//todo: compareOptions events
|
||||||
}
|
}
|
||||||
@ -272,3 +275,203 @@ void MapComparer::operator() (const std::unique_ptr<CMap>& actual, const std::un
|
|||||||
this->expected = expected.get();
|
this->expected = expected.get();
|
||||||
compare();
|
compare();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//JsonMapComparer
|
||||||
|
JsonMapComparer::JsonMapComparer():
|
||||||
|
strict(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vstd::ScopeGuard<JsonMapComparer::TScopeGuard> JsonMapComparer::pushName(const std::string & name)
|
||||||
|
{
|
||||||
|
namePath.push_back(name);
|
||||||
|
return vstd::makeScopeGuard<TScopeGuard>([this](){namePath.pop_back();});
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string JsonMapComparer::buildMessage(const std::string & message)
|
||||||
|
{
|
||||||
|
std::stringstream buf;
|
||||||
|
|
||||||
|
for(auto & s : namePath)
|
||||||
|
buf << s << "|";
|
||||||
|
buf << " " << message;
|
||||||
|
return buf.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::addError(const std::string & message)
|
||||||
|
{
|
||||||
|
BOOST_ERROR(buildMessage(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::addWarning(const std::string & message)
|
||||||
|
{
|
||||||
|
BOOST_WARN_MESSAGE(false, buildMessage(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JsonMapComparer::isEmpty(const JsonNode & value)
|
||||||
|
{
|
||||||
|
switch (value.getType())
|
||||||
|
{
|
||||||
|
case JsonNode::DATA_NULL:
|
||||||
|
return true;
|
||||||
|
case JsonNode::DATA_BOOL:
|
||||||
|
return !value.Bool();
|
||||||
|
case JsonNode::DATA_FLOAT:
|
||||||
|
return value.Float() == 0;
|
||||||
|
case JsonNode::DATA_STRING:
|
||||||
|
return value.String() == "";
|
||||||
|
case JsonNode::DATA_VECTOR:
|
||||||
|
return value.Vector().empty();
|
||||||
|
case JsonNode::DATA_STRUCT:
|
||||||
|
return value.Struct().empty();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BOOST_FAIL("Unknown Json type");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::check(const bool condition, const std::string & message)
|
||||||
|
{
|
||||||
|
if(strict)
|
||||||
|
BOOST_REQUIRE_MESSAGE(condition, buildMessage(message));
|
||||||
|
else
|
||||||
|
BOOST_CHECK_MESSAGE(condition, buildMessage(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkEqualInteger(const si64 actual, const si64 expected)
|
||||||
|
{
|
||||||
|
if(actual != expected)
|
||||||
|
{
|
||||||
|
check(false, boost::str(boost::format("'%d' != '%d'") % actual % expected));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkEqualFloat(const double actual, const double expected)
|
||||||
|
{
|
||||||
|
if(std::abs(actual - expected) > 1e-6)
|
||||||
|
{
|
||||||
|
check(false, boost::str(boost::format("'%d' != '%d' (diff %d)") % actual % expected % (expected - actual)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkEqualString(const std::string & actual, const std::string & expected)
|
||||||
|
{
|
||||||
|
if(actual != expected)
|
||||||
|
{
|
||||||
|
check(false, boost::str(boost::format("'%s' != '%s'") % actual % expected));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkEqualJson(const JsonMap & actual, const JsonMap & expected)
|
||||||
|
{
|
||||||
|
for(const auto & p : expected)
|
||||||
|
checkStructField(actual, p.first, p.second);
|
||||||
|
for(const auto & p : actual)
|
||||||
|
checkExcessStructField(p.second, p.first, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkEqualJson(const JsonVector & actual, const JsonVector & expected)
|
||||||
|
{
|
||||||
|
check(actual.size() == expected.size(), "size mismatch");
|
||||||
|
|
||||||
|
size_t sz = std::min(actual.size(), expected.size());
|
||||||
|
|
||||||
|
for(size_t idx = 0; idx < sz; idx ++)
|
||||||
|
{
|
||||||
|
auto guard = pushName(boost::to_string(idx));
|
||||||
|
|
||||||
|
checkEqualJson(actual.at(idx), expected.at(idx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkEqualJson(const JsonNode & actual, const JsonNode & expected)
|
||||||
|
{
|
||||||
|
//name has been pushed before
|
||||||
|
|
||||||
|
const bool validType = actual.getType() == expected.getType();
|
||||||
|
|
||||||
|
if(!validType)
|
||||||
|
addError("type mismatch");
|
||||||
|
|
||||||
|
//do detail checks avoiding assertions in JsonNode
|
||||||
|
if(validType)
|
||||||
|
{
|
||||||
|
switch (actual.getType())
|
||||||
|
{
|
||||||
|
case JsonNode::DATA_NULL:
|
||||||
|
break; //do nothing
|
||||||
|
case JsonNode::DATA_BOOL:
|
||||||
|
check(actual.Bool() == expected.Bool(), "mismatch");
|
||||||
|
break;
|
||||||
|
case JsonNode::DATA_FLOAT:
|
||||||
|
checkEqualFloat(actual.Float(),expected.Float());
|
||||||
|
break;
|
||||||
|
case JsonNode::DATA_STRING:
|
||||||
|
checkEqualString(actual.String(),expected.String());
|
||||||
|
break;
|
||||||
|
case JsonNode::DATA_VECTOR:
|
||||||
|
checkEqualJson(actual.Vector(), expected.Vector());
|
||||||
|
break;
|
||||||
|
case JsonNode::DATA_STRUCT:
|
||||||
|
checkEqualJson(actual.Struct(), expected.Struct());
|
||||||
|
break;
|
||||||
|
case JsonNode::DATA_INTEGER:
|
||||||
|
checkEqualInteger(actual.Integer(), expected.Integer());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BOOST_FAIL("Unknown Json type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkExcessStructField(const JsonNode & actualValue, const std::string & name, const JsonMap & expected)
|
||||||
|
{
|
||||||
|
auto guard = pushName(name);
|
||||||
|
|
||||||
|
if(!vstd::contains(expected, name))
|
||||||
|
{
|
||||||
|
if(isEmpty(actualValue))
|
||||||
|
addWarning("excess");
|
||||||
|
else
|
||||||
|
addError("excess");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::checkStructField(const JsonMap & actual, const std::string & name, const JsonNode & expectedValue)
|
||||||
|
{
|
||||||
|
auto guard = pushName(name);
|
||||||
|
|
||||||
|
if(!vstd::contains(actual, name))
|
||||||
|
{
|
||||||
|
if(isEmpty(expectedValue))
|
||||||
|
addWarning("missing");
|
||||||
|
else
|
||||||
|
addError("missing");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
checkEqualJson(actual.at(name), expectedValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::compareHeader(const JsonNode & actual, const JsonNode & expected)
|
||||||
|
{
|
||||||
|
strict = false;
|
||||||
|
auto guard = pushName("hdr");
|
||||||
|
checkEqualJson(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::compareObjects(const JsonNode & actual, const JsonNode & expected)
|
||||||
|
{
|
||||||
|
strict = false;
|
||||||
|
auto guard = pushName("obj");
|
||||||
|
checkEqualJson(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonMapComparer::compareTerrain(const std::string & levelName, const JsonNode & actual, const JsonNode & expected)
|
||||||
|
{
|
||||||
|
strict = true;
|
||||||
|
auto guard = pushName(levelName);
|
||||||
|
checkEqualJson(actual, expected);
|
||||||
|
}
|
||||||
|
@ -10,7 +10,17 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../lib/mapping/CMap.h"
|
#include "../lib/ScopeGuard.h"
|
||||||
|
#include "../lib/JsonNode.h"
|
||||||
|
|
||||||
|
namespace vstd
|
||||||
|
{
|
||||||
|
template<typename Func>
|
||||||
|
class ScopeGuard;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CMap;
|
||||||
|
class CGObjectInstance;
|
||||||
|
|
||||||
struct MapComparer
|
struct MapComparer
|
||||||
{
|
{
|
||||||
@ -28,4 +38,40 @@ struct MapComparer
|
|||||||
void operator() (const std::unique_ptr<CMap>& actual, const std::unique_ptr<CMap>& expected);
|
void operator() (const std::unique_ptr<CMap>& actual, const std::unique_ptr<CMap>& expected);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct JsonMapComparer
|
||||||
|
{
|
||||||
|
typedef std::function<void(void)> TScopeGuard;
|
||||||
|
|
||||||
|
bool strict;
|
||||||
|
std::list<std::string> namePath;
|
||||||
|
|
||||||
|
JsonMapComparer();
|
||||||
|
|
||||||
|
vstd::ScopeGuard<TScopeGuard> pushName(const std::string & name);
|
||||||
|
|
||||||
|
std::string buildMessage(const std::string & message);
|
||||||
|
|
||||||
|
void addError(const std::string & message);
|
||||||
|
void addWarning(const std::string & message);
|
||||||
|
|
||||||
|
bool isEmpty(const JsonNode & value);
|
||||||
|
|
||||||
|
void check(const bool condition, const std::string & message);
|
||||||
|
|
||||||
|
void checkExcessStructField(const JsonNode & actualValue, const std::string & name, const JsonMap & expected);
|
||||||
|
void checkStructField(const JsonMap & actual, const std::string & name, const JsonNode & expectedValue);
|
||||||
|
|
||||||
|
void checkEqualInteger(const si64 actual, const si64 expected);
|
||||||
|
void checkEqualFloat(const double actual, const double expected);
|
||||||
|
void checkEqualString(const std::string & actual, const std::string & expected);
|
||||||
|
|
||||||
|
void checkEqualJson(const JsonNode & actual, const JsonNode & expected);
|
||||||
|
void checkEqualJson(const JsonMap & actual, const JsonMap & expected);
|
||||||
|
void checkEqualJson(const JsonVector & actual, const JsonVector & expected);
|
||||||
|
|
||||||
|
void compareHeader(const JsonNode & actual, const JsonNode & expected);
|
||||||
|
void compareObjects(const JsonNode & actual, const JsonNode & expected);
|
||||||
|
void compareTerrain(const std::string & levelName, const JsonNode & actual, const JsonNode & expected);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
367
test/testdata/ObjectPropertyTest/header.json
vendored
Normal file
367
test/testdata/ObjectPropertyTest/header.json
vendored
Normal file
@ -0,0 +1,367 @@
|
|||||||
|
{
|
||||||
|
"allowedAbilities" : {
|
||||||
|
"anyOf" : [
|
||||||
|
"airMagic",
|
||||||
|
"archery",
|
||||||
|
"armorer",
|
||||||
|
"artillery",
|
||||||
|
"ballistics",
|
||||||
|
"diplomacy",
|
||||||
|
"earthMagic",
|
||||||
|
"estates",
|
||||||
|
"fireMagic",
|
||||||
|
"firstAid",
|
||||||
|
"intelligence",
|
||||||
|
"leadership",
|
||||||
|
"learning",
|
||||||
|
"logistics",
|
||||||
|
"luck",
|
||||||
|
"mysticism",
|
||||||
|
"navigation",
|
||||||
|
"necromancy",
|
||||||
|
"offence",
|
||||||
|
"pathfinding",
|
||||||
|
"resistance",
|
||||||
|
"scholar",
|
||||||
|
"scouting",
|
||||||
|
"sorcery",
|
||||||
|
"tactics",
|
||||||
|
"waterMagic",
|
||||||
|
"wisdom"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"allowedArtifacts" : {
|
||||||
|
"anyOf" : [
|
||||||
|
"admiralsHat",
|
||||||
|
"angelicAlliance",
|
||||||
|
"armageddonsBlade",
|
||||||
|
"armorOfTheDamned",
|
||||||
|
"bowOfTheSharpshooter",
|
||||||
|
"cloakOfTheUndeadKing",
|
||||||
|
"cornucopia",
|
||||||
|
"elixirOfLife",
|
||||||
|
"powerOfTheDragonFather",
|
||||||
|
"ringOfTheMagi",
|
||||||
|
"statueOfLegion",
|
||||||
|
"titansThunder",
|
||||||
|
"vialOfDragonBlood",
|
||||||
|
"wizardsWell"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"allowedHeroes" : {
|
||||||
|
"anyOf" : [
|
||||||
|
"adela",
|
||||||
|
"adelaide",
|
||||||
|
"aenain",
|
||||||
|
"aeris",
|
||||||
|
"aine",
|
||||||
|
"aislinn",
|
||||||
|
"ajit",
|
||||||
|
"alagar",
|
||||||
|
"alamar",
|
||||||
|
"alkin",
|
||||||
|
"andra",
|
||||||
|
"arlach",
|
||||||
|
"ash",
|
||||||
|
"astral",
|
||||||
|
"axsis",
|
||||||
|
"ayden",
|
||||||
|
"brissa",
|
||||||
|
"broghild",
|
||||||
|
"bron",
|
||||||
|
"caitlin",
|
||||||
|
"calh",
|
||||||
|
"calid",
|
||||||
|
"charna",
|
||||||
|
"christian",
|
||||||
|
"ciele",
|
||||||
|
"clancy",
|
||||||
|
"clavius",
|
||||||
|
"coronius",
|
||||||
|
"cragHack",
|
||||||
|
"cuthbert",
|
||||||
|
"cyra",
|
||||||
|
"dace",
|
||||||
|
"damacon",
|
||||||
|
"daremyth",
|
||||||
|
"darkstorn",
|
||||||
|
"deemer",
|
||||||
|
"dessa",
|
||||||
|
"drakon",
|
||||||
|
"elleshar",
|
||||||
|
"erdamon",
|
||||||
|
"fafner",
|
||||||
|
"fiona",
|
||||||
|
"fiur",
|
||||||
|
"galthran",
|
||||||
|
"gelare",
|
||||||
|
"gem",
|
||||||
|
"geon",
|
||||||
|
"gerwulf",
|
||||||
|
"gird",
|
||||||
|
"gretchin",
|
||||||
|
"grindan",
|
||||||
|
"gundula",
|
||||||
|
"gunnar",
|
||||||
|
"gurnisson",
|
||||||
|
"halon",
|
||||||
|
"ignatius",
|
||||||
|
"ignissa",
|
||||||
|
"inteus",
|
||||||
|
"iona",
|
||||||
|
"isra",
|
||||||
|
"ivor",
|
||||||
|
"jabarkas",
|
||||||
|
"jaegar",
|
||||||
|
"jeddite",
|
||||||
|
"jenova",
|
||||||
|
"josephine",
|
||||||
|
"kalt",
|
||||||
|
"korbac",
|
||||||
|
"krellion",
|
||||||
|
"kyrre",
|
||||||
|
"labetha",
|
||||||
|
"lacus",
|
||||||
|
"lorelei",
|
||||||
|
"loynis",
|
||||||
|
"malcom",
|
||||||
|
"malekith",
|
||||||
|
"marius",
|
||||||
|
"melodia",
|
||||||
|
"mephala",
|
||||||
|
"merist",
|
||||||
|
"mirlanda",
|
||||||
|
"moandor",
|
||||||
|
"monere",
|
||||||
|
"nagash",
|
||||||
|
"neela",
|
||||||
|
"nimbus",
|
||||||
|
"nymus",
|
||||||
|
"octavia",
|
||||||
|
"olema",
|
||||||
|
"oris",
|
||||||
|
"pasis",
|
||||||
|
"piquedram",
|
||||||
|
"pyre",
|
||||||
|
"rashka",
|
||||||
|
"rion",
|
||||||
|
"rissa",
|
||||||
|
"rosic",
|
||||||
|
"ryland",
|
||||||
|
"sandro",
|
||||||
|
"sanya",
|
||||||
|
"saurug",
|
||||||
|
"sephinroth",
|
||||||
|
"septienna",
|
||||||
|
"serena",
|
||||||
|
"shakti",
|
||||||
|
"shiva",
|
||||||
|
"sirMullich",
|
||||||
|
"solmyr",
|
||||||
|
"straker",
|
||||||
|
"styg",
|
||||||
|
"sylvia",
|
||||||
|
"synca",
|
||||||
|
"tamika",
|
||||||
|
"tazar",
|
||||||
|
"terek",
|
||||||
|
"thane",
|
||||||
|
"thant",
|
||||||
|
"theodorus",
|
||||||
|
"thorgrim",
|
||||||
|
"thunar",
|
||||||
|
"tiva",
|
||||||
|
"torosar ",
|
||||||
|
"tyraxor",
|
||||||
|
"tyris",
|
||||||
|
"ufretin",
|
||||||
|
"uland",
|
||||||
|
"verdish",
|
||||||
|
"vey",
|
||||||
|
"vidomina",
|
||||||
|
"vokial",
|
||||||
|
"voy",
|
||||||
|
"wystan",
|
||||||
|
"xarfax",
|
||||||
|
"xsi",
|
||||||
|
"xyron",
|
||||||
|
"yog",
|
||||||
|
"zubin",
|
||||||
|
"zydar"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"allowedSpells" : {
|
||||||
|
"anyOf" : [
|
||||||
|
"airElemental",
|
||||||
|
"airShield",
|
||||||
|
"animateDead",
|
||||||
|
"antiMagic",
|
||||||
|
"armageddon",
|
||||||
|
"berserk",
|
||||||
|
"bless",
|
||||||
|
"blind",
|
||||||
|
"bloodlust",
|
||||||
|
"chainLightning",
|
||||||
|
"clone",
|
||||||
|
"counterstrike",
|
||||||
|
"cure",
|
||||||
|
"curse",
|
||||||
|
"deathRipple",
|
||||||
|
"destroyUndead",
|
||||||
|
"dimensionDoor",
|
||||||
|
"disguise",
|
||||||
|
"dispel",
|
||||||
|
"disruptingRay",
|
||||||
|
"earthElemental",
|
||||||
|
"earthquake",
|
||||||
|
"fireElemental",
|
||||||
|
"fireShield",
|
||||||
|
"fireWall",
|
||||||
|
"fireball",
|
||||||
|
"fly",
|
||||||
|
"forceField",
|
||||||
|
"forgetfulness",
|
||||||
|
"fortune",
|
||||||
|
"frenzy",
|
||||||
|
"frostRing",
|
||||||
|
"haste",
|
||||||
|
"hypnotize",
|
||||||
|
"iceBolt",
|
||||||
|
"implosion",
|
||||||
|
"inferno",
|
||||||
|
"landMine",
|
||||||
|
"lightningBolt",
|
||||||
|
"magicArrow",
|
||||||
|
"magicMirror",
|
||||||
|
"meteorShower",
|
||||||
|
"mirth",
|
||||||
|
"misfortune",
|
||||||
|
"prayer",
|
||||||
|
"precision",
|
||||||
|
"protectAir",
|
||||||
|
"protectEarth",
|
||||||
|
"protectFire",
|
||||||
|
"protectWater",
|
||||||
|
"quicksand",
|
||||||
|
"removeObstacle",
|
||||||
|
"resurrection",
|
||||||
|
"sacrifice",
|
||||||
|
"scuttleBoat",
|
||||||
|
"shield",
|
||||||
|
"slayer",
|
||||||
|
"slow",
|
||||||
|
"sorrow",
|
||||||
|
"stoneSkin",
|
||||||
|
"summonBoat",
|
||||||
|
"teleport",
|
||||||
|
"titanBolt",
|
||||||
|
"townPortal",
|
||||||
|
"viewAir",
|
||||||
|
"viewEarth",
|
||||||
|
"visions",
|
||||||
|
"waterElemental",
|
||||||
|
"waterWalk",
|
||||||
|
"weakness"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"defeatIconIndex" : 3,
|
||||||
|
"defeatString" : "Test defeatString",
|
||||||
|
"difficulty" : "NORMAL",
|
||||||
|
"mapLevels" : {
|
||||||
|
"surface" : {
|
||||||
|
"height" : 144,
|
||||||
|
"index" : 0,
|
||||||
|
"width" : 144
|
||||||
|
},
|
||||||
|
"underground" : {
|
||||||
|
"height" : 144,
|
||||||
|
"index" : 1,
|
||||||
|
"width" : 144
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mods" : {},
|
||||||
|
"name" : "ObjectPropertyTest v1",
|
||||||
|
"players" : {
|
||||||
|
"blue" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_104" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"green" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_105" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"orange" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_106" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pink" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_109" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"purple" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_107" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"red" : {
|
||||||
|
"canPlay" : "PlayerOrAI",
|
||||||
|
"mainHero" : "hero_101",
|
||||||
|
"heroes" : {
|
||||||
|
"hero_101" : {
|
||||||
|
"type" : "ingham"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tan" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_103" : {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"teal" : {
|
||||||
|
"canPlay" : "AIOnly",
|
||||||
|
"heroes" : {
|
||||||
|
"randomHero_108" : {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"triggeredEvents" : {
|
||||||
|
"standardVictory" : {
|
||||||
|
"condition" : [
|
||||||
|
"standardWin"
|
||||||
|
|
||||||
|
],
|
||||||
|
"effect" : {
|
||||||
|
"messageToSend" : "%s standardVictory effect test message",
|
||||||
|
"type" : "victory"
|
||||||
|
},
|
||||||
|
"message" : "Test standardVictory message"
|
||||||
|
},
|
||||||
|
"standardDefeat" : {
|
||||||
|
"condition" : [
|
||||||
|
"daysWithoutTown",
|
||||||
|
{
|
||||||
|
"value" : 7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect" : {
|
||||||
|
"messageToSend" : "%s standardDefeat effect test message",
|
||||||
|
"type" : "defeat"
|
||||||
|
},
|
||||||
|
"message" : "%s, standardDefeat"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"victoryIconIndex" : 11,
|
||||||
|
"victoryString" : "Test victoryString",
|
||||||
|
"versionMajor" : 1,
|
||||||
|
"versionMinor" : 0
|
||||||
|
}
|
7389
test/testdata/ObjectPropertyTest/objects.ex.json
vendored
Normal file
7389
test/testdata/ObjectPropertyTest/objects.ex.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
7389
test/testdata/ObjectPropertyTest/objects.json
vendored
Normal file
7389
test/testdata/ObjectPropertyTest/objects.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
144
test/testdata/ObjectPropertyTest/surface_terrain.json
vendored
Normal file
144
test/testdata/ObjectPropertyTest/surface_terrain.json
vendored
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
[["gr55_","gr50_","gr50_","gr56_","gr56_","gr52_","gr60_","gr61_","gr69_","gr55_","gr53_","gr54_","gr65_","gr56_","gr50_","gr51_","gr51_","gr64_","gr51_","gr54_","gr53_","gr49_","gr63_","gr68_","gr49_","gr52_","gr54_","gr55_","gr55_","gr54_","gr54_","gr55_","gr56_","gr54_","gr55_","gr52_","gr55_","gr56_","gr71_","gr54_","gr50_","gr69_","gr55_","gr54_","gr53_","gr65_","gr51_","gr50_","gr63_","gr52_","gr54_","gr60_","gr52_","gr50_","gr59_","gr51_","gr49_","gr51_","gr62_","gr49_","gr51_","gr51_","gr49_","gr68_","gr56_","gr51_","gr55_","gr54_","gr52_","gr54_","gr69_","gr52_","gr54_","gr53_","gr51_","gr50_","gr49_","gr51_","gr56_","gr54_","gr51_","gr50_","gr51_","gr56_","gr65_","gr52_","gr51_","gr49_","gr65_","gr51_","gr56_","gr65_","gr54_","gr66_","gr55_","gr54_","gr64_","gr65_","gr50_","gr60_","gr49_","gr53_","gr70_","gr56_","gr50_","gr53_","gr51_","gr52_","gr60_","gr55_","gr56_","gr71_","gr55_","gr49_","gr52_","gr57_","gr54_","gr56_","gr54_","gr51_","gr64_","gr52_","gr54_","gr53_","gr49_","gr50_","gr49_","gr54_","gr55_","gr49_","gr49_","gr56_","gr54_","gr53_","gr58_","gr49_","gr68_","gr55_","gr63_","gr67_","gr54_","gr51_","gr51_","gr69_"],
|
||||||
|
["gr49_","gr49_","gr56_","gr72_","gr49_","gr53_","gr52_","gr50_","gr54_","gr71_","gr54_","gr63_","gr50_","gr59_","gr54_","gr59_","gr53_","gr50_","gr50_","gr57_","gr49_","gr71_","gr50_","gr63_","gr54_","gr50_","gr69_","gr56_","gr55_","gr49_","gr57_","gr56_","gr51_","gr50_","gr55_","gr60_","gr53_","gr51_","gr53_","gr55_","gr52_","gr51_","gr58_","gr54_","gr67_","gr53_","gr70_","gr53_","gr50_","gr68_","gr71_","gr55_","gr52_","gr49_","gr53_","gr51_","gr55_","gr55_","gr55_","gr65_","gr55_","gr56_","gr51_","gr49_","gr52_","gr53_","gr50_","gr52_","gr55_","gr50_","gr49_","gr49_","gr49_","gr56_","gr50_","gr66_","gr51_","gr49_","gr49_","gr52_","gr55_","gr55_","gr55_","gr51_","gr54_","gr69_","gr51_","gr51_","gr56_","gr53_","gr68_","gr56_","gr63_","gr56_","gr56_","gr55_","gr52_","gr49_","gr56_","gr51_","gr57_","gr51_","gr49_","gr49_","gr53_","gr54_","gr68_","gr51_","gr51_","gr54_","gr55_","gr49_","gr51_","gr52_","gr51_","gr52_","gr71_","gr51_","gr52_","gr49_","gr55_","gr59_","gr52_","gr52_","gr54_","gr50_","gr56_","gr50_","gr51_","gr54_","gr49_","gr54_","gr65_","gr53_","gr52_","gr53_","gr56_","gr61_","gr50_","gr50_","gr50_","gr52_","gr49_","gr51_"],
|
||||||
|
["gr54_","gr49_","gr50_","gr50_","gr56_","gr49_","gr65_","gr53_","gr54_","gr52_","gr55_","gr62_","gr61_","gr53_","gr51_","gr51_","gr50_","gr53_","gr53_","gr55_","gr58_","gr56_","gr50_","gr71_","gr50_","gr54_","gr51_","gr70_","gr56_","gr52_","gr54_","gr50_","gr56_","gr49_","gr51_","gr69_","gr55_","gr57_","gr56_","gr53_","gr60_","gr53_","gr54_","gr52_","gr50_","gr57_","gr50_","gr49_","gr56_","gr53_","gr53_","gr53_","gr49_","gr52_","gr52_","gr54_","gr68_","gr56_","gr64_","gr55_","gr69_","gr52_","gr54_","gr55_","gr50_","gr49_","gr65_","gr54_","gr62_","gr50_","gr52_","gr51_","gr50_","gr56_","gr72_","gr56_","gr55_","gr54_","gr52_","gr60_","gr53_","gr54_","gr63_","gr64_","gr56_","gr50_","gr72_","gr51_","gr53_","gr52_","gr55_","gr54_","gr49_","gr54_","gr50_","gr56_","gr59_","gr51_","gr49_","gr59_","gr53_","gr52_","gr50_","gr70_","gr54_","gr68_","gr53_","gr49_","gr67_","gr53_","gr49_","gr52_","gr50_","gr56_","gr53_","gr72_","gr53_","gr49_","gr56_","gr52_","gr61_","gr56_","gr58_","gr50_","gr61_","gr50_","gr49_","gr55_","gr51_","gr53_","gr53_","gr54_","gr50_","gr56_","gr51_","gr54_","gr50_","gr49_","gr54_","gr56_","gr54_","gr61_","gr49_","gr50_"],
|
||||||
|
["gr53_","gr51_","gr71_","gr54_","gr51_","gr57_","gr51_","gr51_","gr69_","gr70_","gr56_","gr51_","gr56_","gr70_","gr51_","gr59_","gr50_","gr49_","gr68_","gr55_","gr55_","gr69_","gr56_","gr51_","gr61_","gr63_","gr58_","gr51_","gr49_","gr70_","gr53_","gr52_","gr56_","gr56_","gr51_","gr57_","gr55_","gr50_","gr50_","gr55_","gr52_","gr53_","gr50_","gr65_","gr50_","gr52_","gr56_","gr53_","gr49_","gr55_","gr54_","gr52_","gr51_","gr51_","gr56_","gr54_","gr56_","gr55_","gr49_","gr68_","gr51_","gr72_","gr52_","gr60_","gr51_","gr70_","gr51_","gr49_","gr59_","gr53_","gr52_","gr72_","gr50_","gr53_","gr54_","gr60_","gr51_","gr51_","gr35_","gr30|","gr31|","gr29|","gr31|","gr30|","gr28|","gr30|","gr29|","gr29|","gr29|","gr31|","gr31|","gr31|","gr33-","gr52_","gr54_","gr58_","gr52_","gr61_","gr54_","gr55_","gr53_","gr57_","gr49_","gr55_","gr55_","gr55_","gr70_","gr53_","gr52_","gr51_","gr68_","gr55_","gr52_","gr53_","gr52_","gr55_","gr57_","gr50_","gr50_","gr67_","gr58_","gr50_","gr64_","gr70_","gr52_","gr56_","gr51_","gr52_","gr69_","gr54_","gr52_","gr65_","gr56_","gr54_","gr57_","gr51_","gr52_","gr50_","gr49_","gr51_","gr68_","gr52_","gr67_","gr56_"],
|
||||||
|
["gr56_","gr54_","gr56_","gr52_","gr50_","gr52_","gr52_","gr54_","gr67_","gr53_","gr49_","gr54_","gr52_","gr54_","gr60_","gr52_","gr53_","gr55_","gr62_","gr49_","gr49_","gr60_","gr52_","gr52_","gr55_","gr54_","gr56_","gr54_","gr51_","gr55_","gr54_","gr55_","gr68_","gr65_","gr63_","gr55_","gr51_","gr55_","gr49_","gr53_","gr66_","gr50_","gr53_","gr52_","gr51_","gr54_","gr56_","gr49_","gr52_","gr58_","gr51_","gr54_","gr50_","gr52_","gr51_","gr66_","gr50_","gr51_","gr49_","gr63_","gr50_","gr67_","gr51_","gr50_","gr54_","gr52_","gr57_","gr55_","gr60_","gr51_","gr49_","gr50_","gr57_","gr56_","gr60_","gr55_","gr49_","gr54_","gr24-","wt0_","wt8_","wt10_","wt11_","wt10_","wt8_","wt10_","wt11_","wt9_","wt11_","wt9_","wt11_","wt3-","gr26_","gr72_","gr52_","gr51_","gr56_","gr49_","gr55_","gr52_","gr51_","gr49_","gr69_","gr53_","gr71_","gr55_","gr55_","gr55_","gr54_","gr56_","gr49_","gr51_","gr56_","gr52_","gr70_","gr56_","gr49_","gr55_","gr58_","gr55_","gr70_","gr49_","gr70_","gr56_","gr60_","gr55_","gr64_","gr49_","gr50_","gr55_","gr64_","gr54_","gr50_","gr72_","gr52_","gr60_","gr52_","gr56_","gr53_","gr53_","gr50_","gr51_","gr55_","gr55_"],
|
||||||
|
["gr61_","gr51_","gr53_","gr61_","gr55_","gr50_","gr51_","gr53_","gr55_","gr50_","gr50_","gr56_","gr56_","gr54_","gr63_","gr61_","gr50_","gr55_","gr52_","gr54_","gr56_","gr56_","gr70_","gr49_","gr56_","gr49_","gr62_","gr56_","gr54_","gr56_","gr56_","gr50_","gr49_","gr67_","gr55_","gr56_","gr53_","gr71_","gr54_","gr64_","gr55_","gr52_","gr56_","gr53_","gr52_","gr55_","gr50_","gr54_","gr58_","gr55_","gr52_","gr51_","gr53_","gr49_","gr51_","gr51_","gr52_","gr52_","gr50_","gr56_","gr49_","gr61_","gr52_","gr49_","gr53_","gr52_","gr52_","gr55_","gr49_","gr53_","gr53_","gr49_","gr54_","gr64_","gr50_","gr64_","gr55_","gr49_","gr24-","wt5_","wt21_","wt25_","wt32_","wt25_","wt30_","wt32_","wt28_","wt21_","wt24_","wt28_","wt30_","wt7-","gr24_","gr52_","gr52_","gr69_","gr56_","gr55_","gr52_","gr68_","gr54_","gr52_","gr55_","gr55_","gr53_","gr53_","gr55_","gr64_","gr49_","gr61_","gr56_","gr55_","gr64_","gr68_","gr52_","gr68_","gr61_","gr55_","gr56_","gr54_","gr49_","gr54_","gr52_","gr56_","gr53_","gr52_","gr54_","gr55_","gr50_","gr58_","gr55_","gr70_","gr49_","gr52_","gr61_","gr50_","gr59_","gr59_","gr64_","gr53_","gr66_","gr50_","gr61_","gr55_"],
|
||||||
|
["gr53_","gr49_","gr53_","gr56_","gr56_","gr52_","gr63_","gr56_","gr50_","gr52_","gr50_","gr56_","gr54_","gr69_","gr52_","gr54_","gr59_","gr55_","gr70_","gr53_","gr52_","gr54_","gr54_","gr50_","gr56_","gr50_","gr51_","gr56_","gr50_","gr63_","gr52_","gr53_","gr66_","gr54_","gr50_","gr50_","gr67_","gr50_","gr49_","gr55_","gr51_","gr60_","gr51_","gr53_","gr62_","gr56_","gr53_","gr66_","gr51_","gr53_","gr72_","gr49_","gr69_","gr49_","gr49_","gr56_","gr60_","gr51_","gr50_","gr56_","gr50_","gr55_","gr55_","gr72_","gr54_","gr53_","gr49_","gr57_","gr52_","gr50_","gr55_","gr51_","gr59_","gr53_","gr56_","gr55_","gr61_","gr52_","gr27-","wt6_","wt24_","wt24_","wt29_","wt24_","wt22_","wt22_","wt26_","wt26_","wt22_","wt23_","wt23_","wt7-","gr27_","gr55_","gr53_","gr56_","gr50_","gr53_","gr52_","gr54_","gr53_","gr51_","gr56_","gr69_","gr50_","gr64_","gr63_","gr55_","gr52_","gr65_","gr49_","gr51_","gr50_","gr54_","gr54_","gr50_","gr55_","gr51_","gr51_","gr50_","gr58_","gr56_","gr65_","gr55_","gr63_","gr49_","gr62_","gr53_","gr52_","gr54_","gr51_","gr55_","gr53_","gr53_","gr52_","gr59_","gr56_","gr52_","gr50_","gr52_","gr50_","gr71_","gr52_","gr55_"],
|
||||||
|
["gr56_","gr64_","gr50_","gr62_","gr55_","gr49_","gr49_","gr56_","gr52_","gr68_","gr50_","gr54_","gr52_","gr52_","gr51_","gr56_","gr54_","gr49_","gr52_","gr54_","gr52_","gr72_","gr59_","gr55_","gr54_","gr72_","gr49_","gr54_","gr55_","gr55_","gr50_","gr56_","gr54_","gr51_","gr49_","gr55_","gr54_","gr49_","gr50_","gr50_","gr54_","gr49_","gr54_","gr67_","gr49_","gr56_","gr59_","gr72_","gr63_","gr53_","gr49_","gr50_","gr51_","gr52_","gr54_","gr49_","gr51_","gr63_","gr50_","gr53_","gr51_","gr64_","gr52_","gr55_","gr50_","gr55_","gr51_","gr54_","gr52_","gr50_","gr54_","gr50_","gr54_","gr56_","gr53_","gr53_","gr53_","gr69_","gr25-","wt6_","wt22_","wt30_","wt30_","wt21_","wt25_","wt23_","wt25_","wt32_","wt29_","wt28_","wt27_","wt5-","gr24_","gr66_","gr56_","gr66_","gr54_","gr69_","gr49_","gr50_","gr49_","gr53_","gr53_","gr55_","gr54_","gr56_","gr55_","gr52_","gr56_","gr52_","gr52_","gr55_","gr55_","gr56_","gr60_","gr50_","gr53_","gr65_","gr52_","gr51_","gr51_","gr55_","gr55_","gr52_","gr50_","gr61_","gr56_","gr51_","gr58_","gr68_","gr50_","gr51_","gr54_","gr56_","gr72_","gr50_","gr53_","gr65_","gr53_","gr49_","gr51_","gr52_","gr53_","gr55_"],
|
||||||
|
["gr54_","gr72_","gr50_","gr54_","gr58_","gr49_","gr49_","gr68_","gr53_","gr49_","gr50_","gr51_","gr52_","gr49_","gr51_","gr66_","gr52_","gr68_","gr54_","gr58_","gr58_","gr53_","gr54_","gr49_","gr51_","gr52_","gr54_","gr51_","gr68_","gr53_","gr50_","gr52_","gr52_","gr49_","gr52_","gr55_","gr53_","gr51_","gr56_","gr50_","gr55_","gr52_","gr49_","gr71_","gr53_","gr55_","gr50_","gr53_","gr54_","gr54_","gr53_","gr53_","gr53_","gr51_","gr71_","gr54_","gr49_","gr56_","gr50_","gr58_","gr69_","gr56_","gr58_","gr54_","gr49_","gr51_","gr49_","gr53_","gr56_","gr54_","gr51_","gr53_","gr56_","gr56_","gr50_","gr49_","gr69_","gr54_","gr27-","wt5_","wt30_","wt31_","wt31_","wt31_","wt30_","wt27_","wt31_","wt27_","wt24_","wt22_","wt32_","wt6-","gr26_","gr51_","gr53_","gr53_","gr54_","gr54_","gr49_","gr49_","gr50_","gr50_","gr65_","gr54_","gr57_","gr54_","gr55_","gr56_","gr53_","gr55_","gr56_","gr52_","gr55_","gr60_","gr53_","gr52_","gr49_","gr59_","gr51_","gr63_","gr50_","gr67_","gr52_","gr55_","gr53_","gr56_","gr52_","gr50_","gr50_","gr51_","gr52_","gr49_","gr51_","gr55_","gr51_","gr52_","gr56_","gr53_","gr56_","gr52_","gr52_","gr56_","gr56_","gr55_"],
|
||||||
|
["gr54_","gr50_","gr54_","gr56_","gr50_","gr53_","gr54_","gr52_","gr53_","gr51_","gr50_","gr54_","gr68_","gr55_","gr62_","gr52_","gr53_","gr49_","gr51_","gr72_","gr68_","gr54_","gr55_","gr55_","gr55_","gr53_","gr51_","gr53_","gr51_","gr51_","gr68_","gr56_","gr53_","gr56_","gr51_","gr49_","gr50_","gr56_","gr61_","gr54_","gr55_","gr51_","gr51_","gr50_","gr50_","gr54_","gr51_","gr51_","gr63_","gr56_","gr53_","gr51_","gr51_","gr53_","gr55_","gr56_","gr53_","gr62_","gr58_","gr52_","gr56_","gr55_","gr50_","gr53_","gr51_","gr64_","gr50_","gr54_","gr49_","gr53_","gr54_","gr53_","gr49_","gr54_","gr55_","gr51_","gr55_","gr55_","gr27-","wt4_","wt21_","wt29_","wt26_","wt22_","wt30_","wt21_","wt27_","wt32_","wt26_","wt28_","wt29_","wt4-","gr27_","gr52_","gr52_","gr65_","gr56_","gr49_","gr53_","gr50_","gr56_","gr50_","gr67_","gr49_","gr50_","gr49_","gr71_","gr50_","gr51_","gr57_","gr54_","gr49_","gr50_","gr66_","gr51_","gr49_","gr65_","gr49_","gr64_","gr56_","gr55_","gr53_","gr49_","gr49_","gr49_","gr51_","gr49_","gr49_","gr53_","gr51_","gr67_","gr50_","gr54_","gr49_","gr51_","gr51_","gr51_","gr53_","gr58_","gr53_","gr55_","gr52_","gr53_","gr56_"],
|
||||||
|
["gr50_","gr53_","gr54_","gr52_","gr54_","gr52_","gr50_","gr49_","gr51_","gr50_","gr65_","gr71_","gr60_","gr51_","gr50_","gr62_","gr56_","gr35_","gr31|","gr30|","gr33-","gr49_","gr54_","gr50_","gr50_","gr51_","gr72_","gr33_","gr31|","gr29|","gr34-","gr68_","gr49_","gr49_","gr53_","gr53_","gr59_","gr49_","gr55_","gr54_","gr55_","gr64_","gr53_","gr51_","gr55_","gr52_","gr53_","gr49_","gr51_","gr51_","gr65_","gr51_","gr71_","gr51_","gr68_","gr54_","gr49_","gr50_","gr65_","gr61_","gr52_","gr54_","gr53_","gr69_","gr56_","gr54_","gr55_","gr50_","gr55_","gr55_","gr55_","gr65_","gr49_","gr72_","gr52_","gr52_","gr49_","gr70_","gr27-","wt5_","wt31_","wt31_","wt28_","wt22_","wt21_","wt32_","wt32_","wt25_","wt28_","wt26_","wt31_","wt6-","gr27_","gr53_","gr53_","gr52_","gr69_","gr53_","gr69_","gr53_","gr66_","gr54_","gr50_","gr49_","gr51_","gr49_","gr62_","gr50_","gr50_","gr50_","gr55_","gr54_","gr55_","gr56_","gr60_","gr56_","gr54_","gr49_","gr51_","gr54_","gr52_","gr52_","gr54_","gr49_","gr54_","gr53_","gr49_","gr56_","gr51_","gr53_","gr53_","gr53_","gr53_","gr55_","gr49_","gr54_","gr51_","gr59_","gr52_","gr53_","gr50_","gr55_","gr68_","gr49_"],
|
||||||
|
["gr56_","gr57_","gr50_","gr51_","gr72_","gr54_","gr51_","gr66_","gr49_","gr71_","gr49_","gr71_","gr54_","gr71_","gr56_","gr49_","gr71_","gr25-","rc9_","rc11_","gr24_","gr56_","gr51_","gr56_","gr52_","gr71_","gr53_","gr24-","rc8_","rc11_","gr24_","gr49_","gr72_","gr59_","gr52_","gr51_","gr49_","gr53_","gr55_","gr51_","gr52_","gr51_","gr71_","gr50_","gr53_","gr49_","gr50_","gr56_","gr51_","gr56_","gr49_","gr53_","gr55_","gr59_","gr56_","gr56_","gr51_","gr67_","gr49_","gr52_","gr49_","gr52_","gr56_","gr54_","gr71_","gr54_","gr56_","gr56_","gr50_","gr52_","gr53_","gr49_","gr63_","gr56_","gr49_","gr51_","gr52_","gr53_","gr24-","wt1|","wt8|","wt10|","wt10|","wt11|","wt10|","wt11|","wt8|","wt8|","wt10|","wt9|","wt8|","wt1+","gr27_","gr53_","gr56_","gr64_","gr54_","gr50_","gr72_","gr51_","gr50_","gr53_","gr63_","gr61_","gr50_","gr55_","gr54_","gr56_","gr49_","gr66_","gr56_","gr52_","gr71_","gr56_","gr49_","gr50_","gr55_","gr61_","gr52_","gr55_","gr56_","gr64_","gr50_","gr55_","gr52_","gr54_","gr50_","gr56_","gr51_","gr55_","gr52_","gr50_","gr57_","gr55_","gr69_","gr53_","gr59_","gr54_","gr54_","gr51_","gr54_","gr49_","gr68_","gr50_"],
|
||||||
|
["gr65_","gr55_","gr50_","gr52_","gr54_","gr52_","gr50_","gr55_","gr69_","gr49_","gr56_","gr61_","gr49_","gr50_","gr72_","gr52_","gr56_","gr25-","rc16_","rc19_","gr26_","gr51_","gr53_","gr52_","gr52_","gr63_","gr49_","gr25-","rc16_","rc19_","gr25_","gr62_","gr49_","gr70_","gr54_","gr52_","gr52_","gr68_","gr52_","gr52_","gr57_","gr50_","gr49_","gr56_","gr68_","gr54_","gr49_","gr54_","gr52_","gr54_","gr52_","gr49_","gr53_","gr55_","gr49_","gr55_","gr68_","gr50_","gr64_","gr49_","gr54_","gr49_","gr54_","gr54_","gr49_","gr55_","gr69_","gr56_","gr65_","gr53_","gr58_","gr54_","gr53_","gr53_","gr69_","gr56_","gr55_","gr51_","gr33|","gr28_","gr31_","gr28_","gr30_","gr29_","gr29_","gr29_","gr29_","gr29_","gr28_","gr29_","gr29_","gr30_","gr33+","gr52_","gr52_","gr52_","gr56_","gr72_","gr56_","gr50_","gr54_","gr56_","gr50_","gr53_","gr56_","gr50_","gr53_","gr61_","gr50_","gr50_","gr52_","gr50_","gr51_","gr58_","gr49_","gr53_","gr54_","gr52_","gr50_","gr53_","gr58_","gr50_","gr63_","gr52_","gr59_","gr55_","gr69_","gr55_","gr55_","gr51_","gr54_","gr50_","gr49_","gr59_","gr54_","gr49_","gr50_","gr55_","gr56_","gr56_","gr51_","gr50_","gr55_","gr52_"],
|
||||||
|
["gr53_","gr70_","gr53_","gr55_","gr65_","gr61_","gr63_","gr56_","gr56_","gr56_","gr55_","gr49_","gr52_","gr52_","gr49_","gr56_","gr60_","gr27-","rc16_","rc19_","gr25_","gr64_","gr69_","gr51_","gr51_","gr70_","gr53_","gr26-","rc17_","rc19_","gr24_","gr51_","gr54_","gr50_","gr52_","gr55_","gr52_","gr54_","gr72_","gr49_","gr53_","gr71_","gr51_","gr68_","gr52_","gr50_","gr49_","gr53_","gr65_","gr53_","gr51_","gr64_","gr55_","gr55_","gr56_","gr50_","gr52_","gr62_","gr71_","gr53_","gr68_","gr54_","gr54_","gr63_","gr70_","gr49_","gr54_","gr51_","gr54_","gr49_","gr52_","gr54_","gr49_","gr56_","gr50_","gr51_","gr52_","gr49_","gr52_","gr56_","gr53_","gr52_","gr51_","gr55_","gr56_","gr70_","gr53_","gr70_","gr52_","gr71_","gr51_","gr55_","gr51_","gr66_","gr50_","gr65_","gr54_","gr64_","gr51_","gr69_","gr51_","gr65_","gr56_","gr49_","gr53_","gr50_","gr68_","gr56_","gr51_","gr49_","gr58_","gr56_","gr65_","gr52_","gr54_","gr51_","gr65_","gr55_","gr54_","gr56_","gr67_","gr49_","gr59_","gr71_","gr50_","gr55_","gr50_","gr55_","gr61_","gr49_","gr52_","gr52_","gr55_","gr51_","gr54_","gr49_","gr55_","gr69_","gr49_","gr51_","gr49_","gr51_","gr51_","gr70_"],
|
||||||
|
["gr51_","gr54_","gr52_","gr53_","gr49_","gr49_","gr66_","gr70_","gr49_","gr53_","gr54_","gr52_","gr72_","gr53_","gr69_","gr52_","gr51_","gr26-","rc16_","rc19_","gr27_","gr49_","gr51_","gr55_","gr49_","gr49_","gr50_","gr24-","rc16_","rc19_","gr27_","gr56_","gr53_","gr56_","gr54_","gr52_","gr56_","gr68_","gr49_","gr50_","gr55_","gr50_","gr60_","gr54_","gr61_","gr53_","gr51_","gr53_","gr49_","gr54_","gr54_","gr49_","gr70_","gr49_","gr52_","gr49_","gr67_","gr55_","gr33_","gr31|","gr30|","gr28|","gr28|","gr30|","gr31|","gr29|","gr28|","gr31|","gr31|","gr31|","gr28|","gr29|","gr29|","gr31|","gr28|","gr31|","gr28|","gr31|","gr28|","gr30|","gr29|","gr29|","gr31|","gr30|","gr30|","gr29|","gr31|","gr28|","gr28|","gr28|","gr31|","gr28|","gr30|","gr29|","gr30|","gr28|","gr29|","gr34-","gr50_","gr52_","gr58_","gr53_","gr50_","gr50_","gr56_","gr71_","gr50_","gr50_","gr53_","gr56_","gr49_","gr63_","gr49_","gr56_","gr54_","gr68_","gr49_","gr61_","gr56_","gr54_","gr51_","gr53_","gr55_","gr56_","gr50_","gr54_","gr56_","gr56_","gr62_","gr56_","gr69_","gr56_","gr49_","gr69_","gr51_","gr54_","gr68_","gr56_","gr50_","gr68_","gr56_","gr51_","gr49_","gr56_"],
|
||||||
|
["gr53_","gr55_","gr63_","gr53_","gr62_","gr56_","gr51_","gr56_","gr50_","gr63_","gr61_","gr53_","gr53_","gr54_","gr50_","gr56_","gr53_","gr24-","rc17_","rc18_","gr25_","gr54_","gr55_","gr71_","gr54_","gr50_","gr54_","gr26-","rc17_","rc18_","gr26_","gr62_","gr55_","gr56_","gr51_","gr51_","gr58_","gr53_","gr57_","gr56_","gr56_","gr49_","gr53_","gr54_","gr54_","gr56_","gr55_","gr60_","gr51_","gr56_","gr53_","gr53_","gr49_","gr55_","gr55_","gr53_","gr56_","gr61_","gr26-","rc8_","rc20_","rc20_","rc20_","rc20_","rc20_","rc20_","rc21_","rc20_","rc20_","rc20_","rc20_","rc21_","rc20_","rc21_","rc21_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc20_","rc21_","rc20_","rc20_","rc21_","rc21_","rc21_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc21_","rc21_","rc10_","gr24_","gr51_","gr55_","gr55_","gr65_","gr54_","gr55_","gr51_","gr50_","gr49_","gr58_","gr56_","gr54_","gr58_","gr54_","gr69_","gr54_","gr51_","gr70_","gr70_","gr54_","gr72_","gr49_","gr50_","gr55_","gr51_","gr56_","gr51_","gr69_","gr49_","gr49_","gr50_","gr56_","gr51_","gr54_","gr49_","gr51_","gr54_","gr54_","gr55_","gr56_","gr52_","gr51_","gr71_","gr51_","gr56_","gr51_"],
|
||||||
|
["gr49_","gr58_","gr54_","gr63_","gr55_","gr51_","gr49_","gr55_","gr49_","gr54_","gr51_","gr52_","gr50_","gr55_","gr49_","gr52_","gr49_","gr25-","rc16_","rc18_","gr26_","gr53_","gr49_","gr51_","gr50_","gr56_","gr65_","gr24-","rc17_","rc18_","gr25_","gr69_","gr52_","gr56_","gr53_","gr61_","gr56_","gr66_","gr54_","gr50_","gr56_","gr54_","gr55_","gr61_","gr49_","gr49_","gr52_","gr52_","gr56_","gr51_","gr64_","gr50_","gr50_","gr65_","gr55_","gr69_","gr52_","gr65_","gr24-","rc16_","rc24_","rc22_","rc23_","rc27_","rc24_","rc22_","rc23_","rc27_","rc25_","rc23_","rc22_","rc27_","rc25_","rc22_","rc23_","rc26_","rc25_","rc23_","rc22_","rc26_","rc24_","rc23_","rc23_","rc27_","rc24_","rc23_","rc22_","rc27_","rc25_","rc22_","rc23_","rc26_","rc25_","rc23_","rc23_","rc26_","rc19_","gr26_","gr52_","gr50_","gr49_","gr50_","gr49_","gr64_","gr68_","gr50_","gr55_","gr56_","gr51_","gr51_","gr53_","gr53_","gr51_","gr52_","gr51_","gr51_","gr56_","gr51_","gr53_","gr64_","gr55_","gr70_","gr54_","gr70_","gr61_","gr51_","gr51_","gr50_","gr49_","gr57_","gr52_","gr55_","gr53_","gr53_","gr63_","gr51_","gr56_","gr54_","gr68_","gr49_","gr55_","gr49_","gr58_","gr54_"],
|
||||||
|
["gr56_","gr54_","gr57_","gr52_","gr62_","gr65_","gr53_","gr50_","gr56_","gr67_","gr49_","gr49_","gr49_","gr54_","gr50_","gr65_","gr49_","gr27-","rc17_","rc19_","gr27_","gr72_","gr56_","gr51_","gr52_","gr51_","gr53_","gr25-","rc16_","rc19_","gr27_","gr51_","gr52_","gr50_","gr50_","gr50_","gr67_","gr50_","gr64_","gr49_","gr55_","gr56_","gr55_","gr50_","gr52_","gr51_","gr52_","gr61_","gr56_","gr56_","gr55_","gr50_","gr55_","gr53_","gr53_","gr49_","gr56_","gr50_","gr27-","rc16_","rc19_","sn23_","sn20-","rc16_","rc19_","sn23_","sn21-","rc16_","rc18_","sn20_","sn20-","rc17_","rc19_","sn21_","sn20-","rc17_","rc19_","sn22_","sn23-","rc16_","rc18_","sn20_","sn22-","rc16_","rc18_","sn20_","sn23-","rc16_","rc19_","sn23_","sn20-","rc16_","rc19_","sn22_","sn23-","rc17_","rc18_","gr25_","gr54_","gr50_","gr54_","gr56_","gr49_","gr54_","gr68_","gr56_","gr61_","gr52_","gr71_","gr55_","gr50_","gr53_","gr53_","gr60_","gr54_","gr51_","gr54_","gr50_","gr49_","gr52_","gr60_","gr50_","gr58_","gr50_","gr56_","gr56_","gr63_","gr51_","gr66_","gr52_","gr49_","gr50_","gr62_","gr49_","gr62_","gr53_","gr49_","gr49_","gr53_","gr53_","gr56_","gr55_","gr53_","gr49_"],
|
||||||
|
["gr50_","gr60_","gr55_","gr51_","gr49_","gr51_","gr71_","gr49_","gr61_","gr53_","gr55_","gr69_","gr56_","gr53_","gr68_","gr62_","gr51_","gr27-","rc16_","rc18_","gr24_","gr55_","gr54_","gr56_","gr54_","gr68_","gr56_","gr25-","rc17_","rc18_","gr24_","gr50_","gr54_","gr53_","gr51_","gr56_","gr50_","gr53_","gr49_","gr51_","gr53_","gr56_","gr64_","gr54_","gr72_","gr51_","gr61_","gr53_","gr59_","gr70_","gr49_","gr61_","gr49_","gr53_","gr49_","gr49_","gr49_","gr72_","gr26-","rc17_","rc18_","sn21|","sn21+","rc17_","rc19_","sn21|","sn22+","rc17_","rc19_","sn21|","sn22+","rc17_","rc19_","sn23|","sn20+","rc17_","rc18_","sn23|","sn20+","rc16_","rc18_","sn23|","sn21+","rc16_","rc18_","sn20|","sn20+","rc16_","rc18_","sn21|","sn22+","rc17_","rc18_","sn21|","sn21+","rc16_","rc18_","gr25_","gr67_","gr56_","gr50_","gr70_","gr71_","gr56_","gr51_","gr51_","gr51_","gr55_","gr69_","gr51_","gr72_","gr61_","gr49_","gr53_","gr54_","gr52_","gr50_","gr53_","gr66_","gr51_","gr55_","gr52_","gr53_","gr52_","gr51_","gr53_","gr53_","gr69_","gr55_","gr72_","gr50_","gr55_","gr51_","gr49_","gr50_","gr50_","gr49_","gr58_","gr54_","gr55_","gr58_","gr53_","gr51_","gr52_"],
|
||||||
|
["gr54_","gr51_","gr49_","gr52_","gr65_","gr56_","gr55_","gr68_","gr64_","gr52_","gr53_","gr55_","gr56_","gr59_","gr49_","gr51_","gr56_","gr27-","rc16_","rc19_","gr25_","gr56_","gr65_","gr50_","gr62_","gr50_","gr52_","gr27-","rc17_","rc18_","gr26_","gr57_","gr51_","gr57_","gr56_","gr65_","gr55_","gr67_","gr56_","gr66_","gr57_","gr53_","gr49_","gr55_","gr53_","gr67_","gr56_","gr54_","gr56_","gr53_","gr55_","gr49_","gr64_","gr72_","gr51_","gr62_","gr50_","gr60_","gr26-","rc13_","rc15_","sa7_","sa17_","rc13_","rc15_","sa4_","sa6_","rc13_","rc15_","sa4_","sa10_","rc13_","rc14_","sa13_","sa0_","rc13_","rc14_","sa14_","sa2_","rc13_","rc15_","sa2_","sa12_","rc12_","rc15_","sa1_","sa2_","rc13_","rc15_","sa0_","sa3_","rc13_","rc14_","sa1_","sa5_","rc17_","rc19_","gr25_","gr53_","gr52_","gr50_","gr54_","gr50_","gr54_","gr64_","gr51_","gr57_","gr56_","gr51_","gr54_","gr56_","gr61_","gr55_","gr72_","gr49_","gr56_","gr50_","gr52_","gr49_","gr64_","gr49_","gr67_","gr56_","gr61_","gr56_","gr49_","gr69_","gr55_","gr54_","gr53_","gr55_","gr71_","gr54_","gr53_","gr52_","gr52_","gr63_","gr55_","gr70_","gr56_","gr53_","gr49_","gr57_","gr56_"],
|
||||||
|
["gr62_","gr51_","gr55_","gr56_","gr69_","gr56_","gr53_","gr52_","gr51_","gr56_","gr51_","gr56_","gr49_","gr49_","gr55_","gr65_","gr56_","gr25-","rc16_","rc19_","gr24_","gr53_","gr50_","gr55_","gr53_","gr53_","gr55_","gr25-","rc17_","rc18_","gr24_","gr49_","gr51_","gr55_","gr64_","gr52_","gr56_","gr53_","gr52_","gr54_","gr52_","gr55_","gr49_","gr56_","gr50_","gr50_","gr53_","gr56_","gr49_","gr54_","gr49_","gr64_","gr60_","gr55_","gr67_","gr56_","gr50_","gr53_","gr27-","sa0_","sa1_","sa3_","sa4_","sa5_","sa4_","sa2_","sa17_","sa6_","sa8_","sa7_","sa4_","sa5_","sa10_","sa3_","sa4_","sa6_","sa10_","sa2_","sa19_","sa4_","sa2_","sa16_","sa6_","sa1_","sa7_","sa11_","sa16_","sa1_","sa5_","sa3_","sa3_","sa1_","sa15_","sa14_","sa3_","rc17_","rc18_","gr24_","gr56_","gr56_","gr54_","gr51_","gr52_","gr49_","gr53_","gr56_","gr55_","gr71_","gr49_","gr56_","gr51_","gr53_","gr49_","gr51_","gr49_","gr62_","gr55_","gr54_","gr54_","gr56_","gr50_","gr55_","gr51_","gr52_","gr53_","gr52_","gr62_","gr49_","gr64_","gr52_","gr55_","gr49_","gr61_","gr51_","gr53_","gr50_","gr52_","gr50_","gr54_","gr55_","gr56_","gr61_","gr50_","gr52_"],
|
||||||
|
["gr56_","gr52_","gr57_","gr53_","gr55_","gr51_","gr56_","gr56_","gr52_","gr50_","gr49_","gr54_","gr51_","gr53_","gr55_","gr55_","gr50_","gr24-","rc16_","rc18_","gr24_","gr53_","gr49_","gr49_","gr66_","gr70_","gr49_","gr24-","rc17_","rc19_","gr27_","gr56_","gr62_","gr54_","gr53_","gr66_","gr55_","gr50_","gr54_","gr53_","gr54_","gr54_","gr65_","gr54_","gr72_","gr56_","gr68_","gr49_","gr52_","gr56_","gr71_","gr50_","gr52_","gr56_","gr56_","gr53_","gr56_","gr59_","gr25-","sa22_","sa4_","sa1_","sa10_","sa18_","sa3_","sa0_","sa5_","sa20_","sa4_","sa7_","sa9_","sa3_","sa13_","sa1_","sa14_","sa7_","sa2_","sa23_","sa7_","sa3_","sa21_","sa2_","sa3_","sa7_","sa6_","sa4_","sa7_","sa5_","sa7_","sa4_","sa19_","sa3_","sa12_","sa7_","sa1_","rc17_","rc19_","gr26_","gr50_","gr52_","gr49_","gr57_","gr49_","gr56_","gr56_","gr51_","gr52_","gr53_","gr49_","gr50_","gr55_","gr54_","gr53_","gr49_","gr52_","gr71_","gr56_","gr67_","gr56_","gr69_","gr49_","gr49_","gr54_","gr66_","gr51_","gr54_","gr49_","gr60_","gr68_","gr52_","gr60_","gr54_","gr49_","gr53_","gr51_","gr53_","gr72_","gr51_","gr55_","gr52_","gr52_","gr65_","gr53_","gr49_"],
|
||||||
|
["gr53_","gr55_","gr63_","gr54_","gr53_","gr50_","gr49_","gr64_","gr53_","gr49_","gr54_","gr51_","gr54_","gr49_","gr65_","gr53_","gr56_","gr25-","rc17_","rc18_","gr27_","gr65_","gr53_","gr55_","gr55_","gr52_","gr52_","gr27-","rc16_","rc19_","gr26_","gr56_","gr52_","gr55_","gr53_","gr49_","gr66_","gr50_","gr54_","gr49_","gr55_","gr51_","gr49_","gr51_","gr56_","gr54_","gr52_","gr51_","gr66_","gr51_","gr57_","gr53_","gr50_","gr62_","gr51_","gr55_","gr53_","gr55_","gr24-","rc9_","rc20_","rc20_","rc20_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc21_","rc20_","rc20_","rc20_","rc20_","rc21_","rc21_","rc21_","rc20_","rc21_","rc20_","rc21_","rc20_","rc21_","rc21_","rc20_","rc20_","rc21_","rc21_","rc20_","rc21_","rc21_","rc20_","rc21_","rc21_","rc20_","rc30_","rc18_","gr27_","gr53_","gr62_","gr53_","gr53_","gr54_","gr51_","gr50_","gr51_","gr49_","gr57_","gr50_","gr67_","gr52_","gr55_","gr53_","gr55_","gr51_","gr50_","gr55_","gr51_","gr49_","gr62_","gr56_","gr63_","gr56_","gr53_","gr50_","gr56_","gr54_","gr55_","gr60_","gr53_","gr52_","gr52_","gr50_","gr50_","gr62_","gr52_","gr51_","gr56_","gr62_","gr63_","gr49_","gr51_","gr49_","gr61_"],
|
||||||
|
["gr53_","gr51_","gr56_","gr56_","gr49_","gr52_","gr49_","gr61_","gr52_","gr54_","gr51_","gr55_","gr49_","gr53_","gr53_","gr51_","gr56_","gr25-","rc17_","rc18_","gr24_","gr56_","gr56_","gr50_","gr50_","gr55_","gr55_","gr27-","rc17_","rc19_","gr24_","gr49_","gr52_","gr72_","gr49_","gr51_","gr50_","gr62_","gr52_","gr50_","gr55_","gr61_","gr49_","gr54_","gr56_","gr59_","gr55_","gr69_","gr51_","gr55_","gr54_","gr51_","gr52_","gr54_","gr52_","gr53_","gr49_","gr55_","gr25-","rc13_","rc22_","rc23_","rc22_","rc22_","rc22_","rc22_","rc22_","rc23_","rc22_","rc22_","rc23_","rc23_","rc22_","rc22_","rc22_","rc22_","rc23_","rc22_","rc23_","rc22_","rc23_","rc23_","rc23_","rc23_","rc23_","rc23_","rc22_","rc23_","rc23_","rc22_","rc22_","rc23_","rc23_","rc23_","rc22_","rc23_","rc14_","gr24_","gr50_","gr50_","gr49_","gr51_","gr49_","gr51_","gr51_","gr56_","gr54_","gr51_","gr51_","gr51_","gr68_","gr49_","gr55_","gr55_","gr53_","gr55_","gr50_","gr55_","gr55_","gr59_","gr53_","gr52_","gr67_","gr55_","gr49_","gr49_","gr53_","gr58_","gr54_","gr55_","gr56_","gr61_","gr56_","gr51_","gr56_","gr55_","gr60_","gr51_","gr54_","gr49_","gr63_","gr53_","gr72_","gr51_"],
|
||||||
|
["gr56_","gr56_","gr54_","gr53_","gr49_","gr57_","gr53_","gr54_","gr50_","gr55_","gr64_","gr49_","gr53_","gr56_","gr67_","gr50_","gr59_","gr25-","rc16_","rc19_","gr24_","gr50_","gr64_","gr56_","gr53_","gr56_","gr57_","gr24-","rc17_","rc19_","gr27_","gr49_","gr64_","gr67_","gr49_","gr56_","gr54_","gr53_","gr71_","gr54_","gr53_","gr53_","gr49_","gr55_","gr56_","gr55_","gr51_","gr56_","gr55_","gr53_","gr55_","gr51_","gr59_","gr50_","gr51_","gr55_","gr52_","gr62_","gr32|","gr31_","gr28_","gr31_","gr29_","gr29_","gr31_","gr30_","gr31_","gr28_","gr29_","gr30_","gr29_","gr31_","gr30_","gr31_","gr29_","gr31_","gr29_","gr29_","gr30_","gr28_","gr29_","gr31_","gr31_","gr31_","gr28_","gr31_","gr30_","gr31_","gr29_","gr28_","gr30_","gr30_","gr31_","gr30_","gr31_","gr31_","gr28_","gr33+","gr54_","gr49_","gr66_","gr66_","gr56_","gr54_","gr67_","gr51_","gr51_","gr51_","gr53_","gr51_","gr53_","gr51_","gr52_","gr64_","gr52_","gr54_","gr67_","gr54_","gr51_","gr69_","gr49_","gr61_","gr53_","gr72_","gr49_","gr49_","gr54_","gr54_","gr52_","gr51_","gr56_","gr56_","gr58_","gr55_","gr55_","gr62_","gr53_","gr68_","gr53_","gr50_","gr54_","gr54_","gr56_","gr56_"],
|
||||||
|
["gr53_","gr55_","gr71_","gr68_","gr62_","gr50_","gr64_","gr51_","gr54_","gr55_","gr53_","gr49_","gr66_","gr50_","gr50_","gr66_","gr49_","gr27-","rc16_","rc18_","gr26_","gr71_","gr54_","gr52_","gr54_","gr54_","gr51_","gr26-","rc16_","rc19_","gr27_","gr50_","gr54_","gr64_","gr53_","gr55_","gr56_","gr55_","gr56_","gr55_","gr51_","gr65_","gr56_","gr55_","gr50_","gr51_","gr49_","gr51_","gr69_","gr52_","gr52_","gr54_","gr62_","gr49_","gr56_","gr70_","gr54_","gr49_","gr60_","gr53_","gr62_","gr49_","gr70_","gr50_","gr54_","gr49_","gr55_","gr54_","gr65_","gr53_","gr52_","gr64_","gr55_","gr53_","gr54_","gr50_","gr65_","gr54_","gr59_","gr49_","gr49_","gr55_","gr52_","gr56_","gr55_","gr52_","gr69_","gr54_","gr53_","gr54_","gr56_","gr51_","gr61_","gr49_","gr50_","gr55_","gr53_","gr55_","gr54_","gr52_","gr50_","gr53_","gr50_","gr55_","gr50_","gr51_","gr56_","gr50_","gr56_","gr50_","gr49_","gr53_","gr51_","gr50_","gr54_","gr64_","gr56_","gr72_","gr53_","gr51_","gr52_","gr52_","gr55_","gr54_","gr51_","gr65_","gr65_","gr50_","gr52_","gr56_","gr51_","gr62_","gr50_","gr54_","gr68_","gr50_","gr52_","gr49_","gr53_","gr56_","gr61_","gr55_","gr49_","gr70_"],
|
||||||
|
["gr54_","gr55_","gr52_","gr53_","gr55_","gr54_","gr49_","gr53_","gr58_","gr51_","gr65_","gr55_","gr56_","gr51_","gr51_","gr49_","gr49_","gr27-","rc16_","rc18_","gr24_","gr56_","gr58_","gr51_","gr69_","gr49_","gr53_","gr27-","rc16_","rc18_","gr27_","gr52_","gr55_","gr69_","gr69_","gr56_","gr62_","gr52_","gr55_","gr52_","gr55_","gr51_","gr55_","gr52_","gr53_","gr54_","gr49_","gr54_","gr54_","gr69_","gr53_","gr51_","gr63_","gr51_","gr50_","gr49_","gr54_","gr50_","gr56_","gr51_","gr71_","gr53_","gr53_","gr55_","gr63_","gr52_","gr57_","gr55_","gr52_","gr60_","gr50_","gr49_","gr51_","gr69_","gr56_","gr55_","gr56_","gr50_","gr50_","gr56_","gr50_","gr53_","gr71_","gr53_","gr53_","gr56_","gr54_","gr60_","gr62_","gr60_","gr55_","gr49_","gr50_","gr70_","gr55_","gr56_","gr55_","gr50_","gr65_","gr52_","gr57_","gr54_","gr71_","gr51_","gr55_","gr72_","gr52_","gr55_","gr51_","gr56_","gr54_","gr55_","gr70_","gr54_","gr52_","gr52_","gr50_","gr54_","gr53_","gr53_","gr53_","gr56_","gr49_","gr51_","gr53_","gr56_","gr61_","gr54_","gr54_","gr55_","gr67_","gr54_","gr62_","gr56_","gr71_","gr50_","gr58_","gr52_","gr60_","gr53_","gr70_","gr71_","gr53_","gr52_"],
|
||||||
|
["gr49_","gr56_","gr52_","gr65_","gr54_","gr53_","gr55_","gr59_","gr52_","gr53_","gr54_","gr59_","gr55_","gr52_","gr54_","gr65_","gr53_","gr27-","rc17_","rc19_","gr24_","gr52_","gr59_","gr55_","gr52_","gr66_","gr71_","gr24-","rc16_","rc18_","gr27_","gr53_","gr51_","gr52_","gr56_","gr51_","gr49_","gr53_","gr52_","gr70_","gr50_","gr51_","gr54_","gr57_","gr56_","gr72_","gr50_","gr49_","gr58_","gr54_","gr50_","gr50_","gr52_","gr49_","gr50_","gr56_","gr53_","gr56_","gr53_","gr71_","gr56_","gr56_","gr54_","gr68_","gr52_","gr49_","gr55_","gr50_","gr52_","gr55_","gr53_","gr54_","gr55_","gr66_","gr50_","gr59_","gr56_","gr70_","gr50_","gr55_","gr55_","gr52_","gr70_","gr52_","gr55_","gr55_","gr53_","gr55_","gr54_","gr56_","gr62_","gr52_","gr56_","gr51_","gr55_","gr57_","gr52_","gr71_","gr49_","gr63_","gr54_","gr50_","gr49_","gr52_","gr51_","gr51_","gr49_","gr51_","gr64_","gr54_","gr69_","gr50_","gr51_","gr51_","gr54_","gr51_","gr56_","gr55_","gr50_","gr60_","gr54_","gr49_","gr58_","gr55_","gr56_","gr55_","gr51_","gr58_","gr68_","gr55_","gr54_","gr56_","gr55_","gr54_","gr56_","gr55_","gr55_","gr52_","gr51_","gr56_","gr55_","gr54_","gr51_","gr50_"],
|
||||||
|
["gr55_","gr51_","gr65_","gr55_","gr49_","gr56_","gr59_","gr53_","gr53_","gr68_","gr50_","gr54_","gr54_","gr68_","gr51_","gr49_","gr51_","gr27-","rc17_","rc19_","gr27_","gr51_","gr59_","gr55_","gr49_","gr55_","gr56_","gr27-","rc16_","rc19_","gr27_","gr55_","gr49_","gr60_","gr63_","gr49_","gr49_","gr50_","gr55_","gr60_","gr52_","gr55_","gr53_","gr51_","gr52_","gr50_","gr54_","gr53_","gr49_","gr49_","gr58_","gr51_","gr55_","gr66_","gr56_","gr52_","gr67_","gr52_","gr49_","gr50_","gr59_","gr51_","gr56_","gr50_","gr51_","gr55_","gr57_","gr55_","gr72_","gr53_","gr55_","gr56_","gr49_","gr52_","gr51_","gr53_","gr57_","gr50_","gr52_","gr54_","gr55_","gr61_","gr50_","gr53_","gr54_","gr50_","gr49_","gr55_","gr61_","gr49_","gr53_","gr54_","gr71_","gr55_","gr56_","gr50_","gr52_","gr51_","gr53_","gr51_","gr55_","gr49_","gr49_","gr49_","gr70_","gr50_","gr61_","gr53_","gr53_","gr50_","gr53_","gr53_","gr51_","gr49_","gr68_","gr51_","gr68_","gr51_","gr54_","gr55_","gr61_","gr56_","gr52_","gr56_","gr67_","gr52_","gr51_","gr55_","gr53_","gr56_","gr53_","gr53_","gr53_","gr55_","gr63_","gr55_","gr50_","gr50_","gr49_","gr49_","gr49_","gr52_","gr58_","gr49_"],
|
||||||
|
["gr55_","gr55_","gr49_","gr55_","gr49_","gr61_","gr53_","gr52_","gr53_","gr56_","gr54_","gr56_","gr62_","gr51_","gr49_","gr65_","gr52_","gr24-","rc17_","rc18_","gr25_","gr54_","gr56_","gr51_","gr54_","gr51_","gr49_","gr26-","rc17_","rc18_","gr26_","gr50_","gr51_","gr54_","gr50_","gr49_","gr54_","gr57_","gr56_","gr54_","gr52_","gr49_","gr60_","gr60_","gr49_","gr67_","gr51_","gr49_","gr51_","gr54_","gr55_","gr55_","gr62_","gr54_","gr68_","gr60_","gr56_","gr52_","gr53_","gr66_","gr54_","gr52_","gr53_","gr56_","gr53_","gr54_","gr62_","gr55_","gr50_","gr54_","gr54_","gr62_","gr50_","gr52_","gr53_","gr54_","gr50_","gr68_","gr56_","gr54_","gr65_","gr55_","gr56_","gr56_","gr49_","gr72_","gr52_","gr50_","gr66_","gr56_","gr51_","gr71_","gr55_","gr50_","gr51_","gr51_","gr55_","gr56_","gr54_","gr51_","gr53_","gr52_","gr55_","gr50_","gr56_","gr56_","gr57_","gr53_","gr51_","gr55_","gr72_","gr56_","gr62_","gr49_","gr53_","gr54_","gr52_","gr51_","gr55_","gr70_","gr51_","gr52_","gr53_","gr64_","gr56_","gr49_","gr53_","gr52_","gr56_","gr50_","gr56_","gr60_","gr63_","gr51_","gr67_","gr52_","gr53_","gr53_","gr56_","gr65_","gr68_","gr50_","gr51_","gr56_"],
|
||||||
|
["gr51_","gr68_","gr54_","gr50_","gr54_","gr55_","gr53_","gr63_","gr52_","gr50_","gr50_","gr63_","gr55_","gr50_","gr50_","gr50_","gr56_","gr24-","rc17_","rc18_","gr25_","gr68_","gr51_","gr52_","gr49_","gr59_","gr51_","gr27-","rc16_","rc19_","gr27_","gr52_","gr55_","gr49_","gr49_","gr51_","gr55_","gr52_","gr54_","gr68_","gr51_","gr65_","gr50_","gr51_","gr54_","gr51_","gr58_","gr54_","gr55_","gr52_","gr63_","gr53_","gr50_","gr62_","gr54_","gr56_","gr52_","gr51_","gr56_","gr49_","gr50_","gr53_","gr51_","gr54_","gr50_","gr55_","gr56_","gr49_","gr56_","gr50_","gr51_","gr72_","gr50_","gr57_","gr54_","gr53_","gr53_","gr54_","gr53_","gr70_","gr54_","gr50_","gr59_","gr54_","gr50_","gr49_","gr52_","gr50_","gr55_","gr51_","gr50_","gr53_","gr56_","gr53_","gr56_","gr53_","gr52_","gr54_","gr50_","gr52_","gr72_","gr50_","gr67_","gr56_","gr56_","gr50_","gr52_","gr51_","gr66_","gr50_","gr52_","gr52_","gr52_","gr66_","gr51_","gr52_","gr65_","gr53_","gr70_","gr49_","gr72_","gr53_","gr54_","gr71_","gr53_","gr54_","gr49_","gr50_","gr54_","gr62_","gr55_","gr53_","gr55_","gr51_","gr54_","gr70_","gr54_","gr53_","gr54_","gr55_","gr55_","gr55_","gr54_","gr55_"],
|
||||||
|
["gr57_","gr51_","gr54_","gr55_","gr56_","gr51_","gr50_","gr54_","gr49_","gr49_","gr54_","gr53_","gr65_","gr55_","gr60_","gr51_","gr55_","gr27-","rc16_","rc19_","gr26_","gr53_","gr52_","gr49_","gr51_","gr49_","gr52_","gr27-","rc16_","rc18_","gr24_","gr55_","gr54_","gr53_","gr52_","gr63_","gr54_","gr66_","gr50_","gr55_","gr50_","gr61_","gr56_","gr49_","gr69_","gr51_","gr51_","gr50_","gr55_","gr51_","gr51_","gr54_","gr50_","gr49_","gr54_","gr49_","gr54_","gr54_","gr52_","gr71_","gr55_","gr54_","gr67_","gr61_","gr50_","gr56_","gr53_","gr53_","gr51_","gr50_","gr54_","gr54_","gr57_","gr51_","gr62_","gr50_","gr56_","gr55_","gr53_","gr54_","gr54_","gr55_","gr58_","gr54_","gr55_","gr54_","gr50_","gr62_","gr66_","gr52_","gr56_","gr50_","gr49_","gr55_","gr63_","gr63_","gr53_","gr61_","gr49_","gr56_","gr55_","gr51_","gr52_","gr50_","gr56_","gr58_","gr56_","gr64_","gr50_","gr53_","gr66_","gr72_","gr53_","gr52_","gr52_","gr51_","gr51_","gr68_","gr50_","gr65_","gr52_","gr52_","gr55_","gr51_","gr59_","gr65_","gr54_","gr55_","gr55_","gr51_","gr49_","gr56_","gr51_","gr70_","gr54_","gr52_","gr54_","gr58_","gr52_","gr52_","gr52_","gr68_","gr51_","gr54_"],
|
||||||
|
["gr51_","gr51_","gr49_","gr54_","gr54_","gr51_","gr70_","gr49_","gr54_","gr53_","gr49_","gr49_","gr52_","gr53_","gr56_","gr53_","gr72_","gr24-","rc17_","rc19_","gr26_","gr50_","gr51_","gr50_","gr51_","gr60_","gr52_","gr25-","rc13_","rc14_","gr24_","gr50_","gr56_","gr58_","gr50_","gr54_","gr49_","gr51_","gr52_","gr62_","gr55_","gr55_","gr54_","gr53_","gr52_","gr49_","gr70_","gr55_","gr65_","gr51_","gr51_","gr56_","gr56_","gr71_","gr51_","gr62_","gr56_","gr55_","gr55_","gr50_","gr52_","gr61_","gr53_","gr51_","gr52_","gr60_","gr54_","gr68_","gr51_","gr69_","gr54_","gr49_","gr71_","gr50_","gr71_","gr53_","gr68_","gr56_","gr54_","gr55_","gr65_","gr53_","gr52_","gr56_","gr49_","gr54_","gr54_","gr55_","gr52_","gr51_","gr54_","gr54_","gr51_","gr56_","gr56_","gr50_","gr56_","gr54_","gr69_","gr54_","gr60_","gr56_","gr59_","gr49_","gr70_","gr55_","gr51_","gr51_","gr51_","gr71_","gr50_","gr68_","gr56_","gr56_","gr49_","gr61_","gr50_","gr53_","gr53_","gr53_","gr55_","gr56_","gr55_","gr54_","gr58_","gr52_","gr53_","gr62_","gr66_","gr49_","gr56_","gr54_","gr60_","gr52_","gr52_","gr70_","gr53_","gr53_","gr50_","gr54_","gr49_","gr55_","gr49_","gr70_"],
|
||||||
|
["gr55_","gr52_","gr49_","gr56_","gr50_","gr54_","gr55_","gr65_","gr49_","gr54_","gr52_","gr52_","gr71_","gr49_","gr54_","gr54_","gr53_","gr25-","rc17_","rc18_","gr26_","gr50_","gr55_","gr56_","gr51_","gr52_","gr69_","gr33|","gr29_","gr31_","gr35+","gr54_","gr52_","gr49_","gr52_","gr72_","gr65_","gr56_","gr52_","gr50_","gr50_","gr70_","gr68_","gr55_","gr68_","gr56_","gr50_","gr53_","gr54_","gr52_","gr54_","gr61_","gr50_","gr57_","gr54_","gr55_","gr56_","gr53_","gr51_","gr68_","gr51_","gr68_","gr65_","gr51_","gr57_","gr64_","gr51_","gr52_","gr55_","gr68_","gr53_","gr56_","gr51_","gr63_","gr56_","gr55_","gr49_","gr55_","gr65_","gr56_","gr55_","gr68_","gr50_","gr53_","gr56_","gr49_","gr56_","gr52_","gr60_","gr54_","gr52_","gr55_","gr62_","gr65_","gr50_","gr53_","gr62_","gr64_","gr53_","gr55_","gr53_","gr56_","gr56_","gr51_","gr51_","gr58_","gr54_","gr53_","gr52_","gr56_","gr68_","gr49_","gr54_","gr52_","gr50_","gr50_","gr53_","gr66_","gr53_","gr54_","gr56_","gr49_","gr72_","gr63_","gr49_","gr70_","gr54_","gr52_","gr49_","gr49_","gr50_","gr54_","gr50_","gr54_","gr55_","gr52_","gr50_","gr69_","gr56_","gr55_","gr55_","gr50_","gr50_","gr55_"],
|
||||||
|
["gr53_","gr54_","gr52_","gr68_","gr50_","gr60_","gr54_","gr53_","gr59_","gr53_","gr55_","gr53_","gr68_","gr53_","gr70_","gr56_","gr52_","gr27-","rc17_","rc18_","gr27_","gr53_","gr58_","gr50_","gr49_","gr50_","gr53_","gr63_","gr49_","gr54_","gr67_","gr58_","gr52_","gr49_","gr50_","gr51_","gr54_","gr56_","gr50_","gr50_","gr53_","gr67_","gr66_","gr55_","gr69_","gr53_","gr56_","gr50_","gr54_","gr55_","gr70_","gr53_","gr65_","gr54_","gr55_","gr61_","gr55_","gr56_","gr54_","gr52_","gr50_","gr51_","gr55_","gr50_","gr49_","gr54_","gr52_","gr56_","gr49_","gr53_","gr49_","gr51_","gr54_","gr49_","gr64_","gr55_","gr54_","gr54_","gr54_","gr49_","gr55_","gr52_","gr60_","gr52_","gr52_","gr55_","gr56_","gr53_","gr52_","gr55_","gr49_","gr55_","gr50_","gr49_","gr54_","gr72_","gr54_","gr51_","gr56_","gr57_","gr51_","gr52_","gr51_","gr50_","gr71_","gr49_","gr49_","gr52_","gr54_","gr57_","gr55_","gr70_","gr55_","gr67_","gr54_","gr56_","gr54_","gr50_","gr52_","gr51_","gr56_","gr56_","gr56_","gr55_","gr50_","gr56_","gr49_","gr51_","gr50_","gr50_","gr56_","gr56_","gr52_","gr67_","gr49_","gr54_","gr55_","gr67_","gr54_","gr55_","gr70_","gr53_","gr52_","gr55_"],
|
||||||
|
["gr55_","gr50_","gr52_","gr50_","gr55_","gr54_","gr51_","gr69_","gr52_","gr50_","gr50_","gr52_","gr49_","gr56_","gr55_","gr59_","gr54_","gr25-","rc16_","rc18_","gr27_","gr52_","gr50_","gr56_","gr62_","gr69_","gr54_","gr54_","gr52_","gr58_","gr51_","gr70_","gr54_","gr51_","gr52_","gr49_","gr71_","gr52_","gr53_","gr54_","gr54_","gr53_","gr56_","gr62_","gr55_","gr66_","gr56_","gr72_","gr56_","gr52_","gr49_","gr54_","gr53_","gr54_","gr54_","gr71_","gr53_","gr49_","gr49_","gr51_","gr66_","gr56_","gr54_","gr50_","gr68_","gr61_","gr56_","gr53_","gr55_","gr50_","gr59_","gr51_","gr56_","gr49_","gr56_","gr53_","gr53_","gr61_","gr61_","gr51_","gr50_","gr62_","gr50_","gr53_","gr68_","gr49_","gr53_","gr51_","gr50_","gr54_","gr55_","gr61_","gr55_","gr56_","gr60_","gr59_","gr50_","gr56_","gr71_","gr55_","gr70_","gr50_","gr52_","gr70_","gr50_","gr54_","gr52_","gr66_","gr65_","gr49_","gr53_","gr59_","gr51_","gr50_","gr71_","gr49_","gr59_","gr54_","gr56_","gr60_","gr55_","gr52_","gr64_","gr53_","gr59_","gr49_","gr54_","gr58_","gr54_","gr52_","gr49_","gr53_","gr52_","gr51_","gr56_","gr53_","gr50_","gr53_","gr51_","gr60_","gr69_","gr55_","gr56_","gr64_"],
|
||||||
|
["gr52_","gr71_","gr63_","gr51_","gr49_","gr59_","gr53_","gr50_","gr51_","gr51_","gr53_","gr49_","gr71_","gr51_","gr50_","gr53_","gr50_","gr24-","rc17_","rc18_","gr26_","gr62_","gr72_","gr50_","gr50_","gr53_","gr54_","gr51_","gr56_","gr53_","gr54_","gr50_","gr51_","gr54_","gr66_","gr49_","gr54_","gr50_","gr55_","gr54_","gr71_","gr52_","gr53_","gr51_","gr50_","gr54_","gr50_","gr54_","gr70_","gr65_","gr56_","gr58_","gr54_","gr49_","gr50_","gr53_","gr49_","gr55_","gr51_","gr64_","gr51_","gr69_","gr55_","gr50_","gr50_","gr69_","gr56_","gr53_","gr58_","gr51_","gr51_","gr63_","gr49_","gr54_","gr56_","gr58_","gr52_","gr51_","gr53_","gr53_","gr56_","gr49_","gr52_","gr49_","gr50_","gr54_","gr56_","gr52_","gr55_","gr65_","gr52_","gr50_","gr60_","gr54_","gr52_","gr55_","gr56_","gr54_","gr50_","gr54_","gr53_","gr52_","gr50_","gr53_","gr51_","gr49_","gr71_","gr55_","gr53_","gr56_","gr52_","gr56_","gr50_","gr51_","gr51_","gr60_","gr53_","gr68_","gr65_","gr57_","gr53_","gr53_","gr56_","gr49_","gr53_","gr49_","gr60_","gr49_","gr53_","gr72_","gr55_","gr52_","gr64_","gr55_","gr69_","gr49_","gr52_","gr53_","gr56_","gr56_","gr54_","gr55_","gr53_","gr57_"],
|
||||||
|
["gr51_","gr54_","gr54_","gr53_","gr63_","gr52_","gr54_","gr59_","gr50_","gr50_","gr56_","gr61_","gr54_","gr52_","gr56_","gr56_","gr50_","gr27-","rc17_","rc19_","gr27_","gr59_","gr51_","gr49_","gr53_","gr51_","gr53_","gr63_","gr53_","gr56_","gr66_","gr55_","gr59_","gr50_","gr51_","gr68_","gr49_","gr52_","gr54_","gr51_","gr54_","gr56_","gr58_","gr54_","gr53_","gr49_","gr54_","gr53_","gr54_","gr56_","gr51_","gr57_","gr51_","gr56_","gr53_","gr55_","gr68_","gr50_","gr70_","gr51_","gr52_","gr49_","gr51_","gr50_","gr51_","gr55_","gr52_","gr55_","gr50_","gr62_","gr49_","gr55_","gr49_","gr56_","gr64_","gr53_","gr52_","gr56_","gr64_","gr55_","gr49_","gr54_","gr49_","gr55_","gr68_","gr55_","gr49_","gr50_","gr67_","gr50_","gr65_","gr60_","gr51_","gr52_","gr54_","gr51_","gr49_","gr53_","gr49_","gr56_","gr50_","gr49_","gr55_","gr65_","gr52_","gr49_","gr49_","gr49_","gr50_","gr71_","gr53_","gr54_","gr51_","gr53_","gr51_","gr50_","gr52_","gr54_","gr65_","gr51_","gr58_","gr51_","gr72_","gr51_","gr56_","gr56_","gr53_","gr49_","gr63_","gr53_","gr56_","gr54_","gr49_","gr54_","gr56_","gr56_","gr53_","gr59_","gr61_","gr50_","gr55_","gr56_","gr53_","gr50_"],
|
||||||
|
["gr53_","gr53_","gr64_","gr51_","gr51_","gr55_","gr68_","gr49_","gr55_","gr54_","gr58_","gr55_","gr53_","gr62_","gr54_","gr52_","gr52_","gr27-","rc16_","rc19_","gr26_","gr51_","gr53_","gr52_","gr54_","gr62_","gr53_","gr49_","gr51_","gr50_","gr49_","gr52_","gr54_","gr55_","gr49_","gr56_","gr49_","gr66_","gr50_","gr52_","gr52_","gr58_","gr55_","gr56_","gr49_","gr52_","gr52_","gr52_","gr49_","gr56_","gr49_","gr65_","gr54_","gr50_","gr53_","gr54_","gr55_","gr50_","gr56_","gr53_","gr55_","gr53_","gr55_","gr51_","gr54_","gr66_","gr52_","gr51_","gr62_","gr53_","gr52_","gr68_","gr71_","gr55_","gr56_","gr54_","gr69_","gr52_","gr52_","gr49_","gr53_","gr52_","gr50_","gr71_","gr51_","gr50_","gr56_","gr53_","gr54_","gr56_","gr54_","gr54_","gr50_","gr49_","gr65_","gr55_","gr53_","gr54_","gr51_","gr52_","gr51_","gr50_","gr49_","gr49_","gr51_","gr70_","gr51_","gr50_","gr55_","gr69_","gr56_","gr60_","gr56_","gr56_","gr55_","gr50_","gr55_","gr60_","gr55_","gr49_","gr53_","gr63_","gr55_","gr52_","gr52_","gr71_","gr55_","gr57_","gr52_","gr51_","gr69_","gr49_","gr55_","gr56_","gr49_","gr60_","gr53_","gr53_","gr50_","gr67_","gr49_","gr63_","gr63_","gr52_"],
|
||||||
|
["gr50_","gr54_","gr55_","gr50_","gr51_","gr54_","gr56_","gr50_","gr67_","gr56_","gr52_","gr55_","gr54_","gr54_","gr55_","gr55_","gr50_","gr26-","rc16_","rc18_","gr24_","gr55_","gr68_","gr52_","gr55_","gr54_","gr53_","gr49_","gr50_","gr51_","gr57_","gr50_","gr51_","gr54_","gr66_","gr55_","gr54_","gr50_","gr53_","gr57_","gr56_","gr65_","gr52_","gr72_","gr54_","gr54_","gr51_","gr51_","gr71_","gr50_","gr52_","gr52_","gr61_","gr56_","gr51_","gr49_","gr64_","gr56_","gr50_","gr52_","gr50_","gr56_","gr54_","gr60_","gr52_","gr54_","gr56_","gr50_","gr72_","gr55_","gr53_","gr53_","gr53_","gr60_","gr55_","gr70_","gr54_","gr56_","gr58_","gr52_","gr51_","gr51_","gr56_","gr49_","gr55_","gr65_","gr53_","gr52_","gr56_","gr52_","gr51_","gr53_","gr58_","gr54_","gr55_","gr52_","gr52_","gr56_","gr58_","gr50_","gr49_","gr62_","gr49_","gr62_","gr49_","gr56_","gr53_","gr49_","gr69_","gr50_","gr52_","gr51_","gr55_","gr61_","gr55_","gr52_","gr56_","gr60_","gr50_","gr51_","gr71_","gr56_","gr55_","gr59_","gr49_","gr53_","gr51_","gr49_","gr51_","gr59_","gr54_","gr71_","gr50_","gr53_","gr56_","gr52_","gr68_","gr53_","gr71_","gr50_","gr60_","gr54_","gr50_","gr54_"],
|
||||||
|
["gr66_","gr49_","gr49_","gr52_","gr72_","gr49_","gr50_","gr72_","gr54_","gr70_","gr54_","gr54_","gr55_","gr54_","gr50_","gr67_","gr50_","gr24-","rc17_","rc19_","gr24_","gr70_","gr50_","gr72_","gr54_","gr52_","gr52_","gr56_","gr50_","gr51_","gr51_","gr55_","gr52_","gr54_","gr63_","gr49_","gr55_","gr54_","gr54_","gr67_","gr52_","gr54_","gr56_","gr54_","gr52_","gr64_","gr52_","gr51_","gr55_","gr53_","gr50_","gr49_","gr49_","gr56_","gr63_","gr49_","gr55_","gr52_","gr52_","gr51_","gr54_","gr66_","gr55_","gr53_","gr53_","gr68_","gr56_","gr51_","gr54_","gr53_","gr61_","gr50_","gr49_","gr54_","gr54_","gr52_","gr49_","gr51_","gr50_","gr55_","gr60_","gr51_","gr56_","gr54_","gr63_","gr52_","gr71_","gr71_","gr64_","gr53_","gr55_","gr51_","gr51_","gr50_","gr62_","gr49_","gr54_","gr51_","gr52_","gr51_","gr52_","gr53_","gr55_","gr55_","gr53_","gr56_","gr55_","gr55_","gr52_","gr55_","gr51_","gr49_","gr49_","gr51_","gr66_","gr56_","gr53_","gr56_","gr51_","gr50_","gr56_","gr55_","gr54_","gr72_","gr54_","gr51_","gr56_","gr57_","gr53_","gr52_","gr59_","gr55_","gr49_","gr54_","gr52_","gr49_","gr49_","gr51_","gr51_","gr55_","gr56_","gr61_","gr55_","gr49_"],
|
||||||
|
["gr52_","gr60_","gr55_","gr64_","gr50_","gr54_","gr50_","gr51_","gr56_","gr50_","gr56_","gr59_","gr49_","gr53_","gr70_","gr55_","gr68_","gr26-","rc17_","rc19_","gr24_","gr49_","gr53_","gr56_","gr60_","gr55_","gr67_","gr52_","gr50_","gr51_","gr54_","gr61_","gr55_","gr55_","gr72_","gr53_","gr54_","gr53_","gr52_","gr56_","gr54_","gr55_","gr61_","gr51_","gr51_","gr72_","gr55_","gr50_","gr51_","gr49_","gr52_","gr57_","gr58_","gr53_","gr56_","gr52_","gr54_","gr52_","gr54_","gr55_","gr51_","gr51_","gr49_","gr55_","gr49_","gr67_","gr51_","gr54_","gr49_","gr54_","gr49_","gr68_","gr60_","gr69_","gr53_","gr64_","gr52_","gr53_","gr51_","gr51_","gr56_","gr53_","gr53_","gr53_","gr53_","gr66_","gr55_","gr54_","gr55_","gr51_","gr52_","gr55_","gr52_","gr53_","gr55_","gr62_","gr50_","gr56_","gr58_","gr54_","gr68_","gr56_","gr50_","gr60_","gr49_","gr53_","gr49_","gr51_","gr52_","gr59_","gr51_","gr65_","gr53_","gr51_","gr49_","gr55_","gr55_","gr64_","gr50_","gr53_","gr56_","gr51_","gr53_","gr60_","gr60_","gr55_","gr64_","gr50_","gr50_","gr54_","gr52_","gr50_","gr54_","gr50_","gr54_","gr49_","gr53_","gr53_","gr56_","gr59_","gr52_","gr50_","gr62_","gr51_"],
|
||||||
|
["gr57_","gr49_","gr49_","gr54_","gr64_","gr55_","gr55_","gr49_","gr56_","gr52_","gr49_","gr54_","gr68_","gr51_","gr52_","gr52_","gr50_","gr27-","rc17_","rc18_","gr27_","gr55_","gr53_","gr68_","gr49_","gr55_","gr50_","gr56_","gr51_","gr67_","gr52_","gr52_","gr53_","gr50_","gr52_","gr51_","gr49_","gr56_","gr56_","gr51_","gr71_","gr54_","gr49_","gr54_","gr58_","gr56_","gr52_","gr51_","gr49_","gr54_","gr50_","gr51_","gr55_","gr52_","gr56_","gr52_","gr51_","gr58_","gr55_","gr50_","gr49_","gr52_","gr53_","gr49_","gr55_","gr51_","gr50_","gr52_","gr49_","gr50_","gr52_","gr49_","gr54_","gr50_","gr52_","gr51_","gr64_","gr63_","gr55_","gr55_","gr55_","gr56_","gr54_","gr55_","gr55_","gr51_","gr54_","gr50_","gr53_","gr54_","gr56_","gr49_","gr55_","gr55_","gr49_","gr52_","gr49_","gr53_","gr52_","gr51_","gr56_","gr69_","gr52_","gr61_","gr51_","gr55_","gr58_","gr53_","gr53_","gr70_","gr69_","gr56_","gr61_","gr67_","gr53_","gr56_","gr54_","gr50_","gr54_","gr52_","gr55_","gr52_","gr52_","gr54_","gr51_","gr59_","gr49_","gr52_","gr66_","gr49_","gr56_","gr55_","gr55_","gr50_","gr54_","gr55_","gr72_","gr53_","gr52_","gr52_","gr49_","gr55_","gr54_","gr62_"],
|
||||||
|
["gr49_","gr72_","gr55_","gr71_","gr52_","gr52_","gr51_","gr68_","gr55_","gr67_","gr51_","gr56_","gr55_","gr49_","gr52_","gr49_","gr51_","gr27-","rc17_","rc19_","gr25_","gr56_","gr52_","gr53_","gr52_","gr60_","gr49_","gr49_","gr53_","gr49_","gr59_","gr66_","gr53_","gr61_","gr60_","gr51_","gr49_","gr54_","gr58_","gr49_","gr63_","gr67_","gr53_","gr71_","gr50_","gr55_","gr50_","gr51_","gr50_","gr61_","gr51_","gr63_","gr50_","gr71_","gr53_","gr49_","gr56_","gr53_","gr56_","gr51_","gr64_","gr52_","gr67_","gr51_","gr65_","gr52_","gr53_","gr52_","gr54_","gr50_","gr53_","gr60_","gr54_","gr52_","gr59_","gr68_","gr53_","gr55_","gr52_","gr51_","gr49_","gr52_","gr50_","gr51_","gr54_","gr63_","gr49_","gr66_","gr58_","gr55_","gr52_","gr50_","gr50_","gr49_","gr54_","gr65_","gr51_","gr53_","gr49_","gr51_","gr50_","gr54_","gr51_","gr51_","gr52_","gr70_","gr52_","gr69_","gr55_","gr49_","gr49_","gr56_","gr55_","gr53_","gr68_","gr52_","gr49_","gr56_","gr49_","gr56_","gr52_","gr50_","gr50_","gr70_","gr51_","gr55_","gr52_","gr53_","gr53_","gr70_","gr57_","gr54_","gr69_","gr53_","gr52_","gr56_","gr50_","gr58_","gr56_","gr52_","gr63_","gr67_","gr49_","gr50_"],
|
||||||
|
["gr60_","gr55_","gr56_","gr50_","gr52_","gr59_","gr52_","gr51_","gr69_","gr55_","gr60_","gr56_","gr52_","gr54_","gr54_","gr70_","gr54_","gr26-","rc16_","rc19_","gr26_","gr52_","gr72_","gr50_","gr55_","gr55_","gr55_","gr49_","gr56_","gr71_","gr52_","gr49_","gr49_","gr51_","gr49_","gr54_","gr70_","gr55_","gr66_","gr52_","gr54_","gr52_","gr49_","gr55_","gr51_","gr54_","gr51_","gr52_","gr54_","gr53_","gr49_","gr53_","gr57_","gr53_","gr56_","gr49_","gr51_","gr70_","gr50_","gr50_","gr55_","gr52_","gr51_","gr54_","gr53_","gr55_","gr60_","gr54_","gr55_","gr52_","gr67_","gr50_","gr53_","gr51_","gr49_","gr51_","gr51_","gr64_","gr51_","gr55_","gr54_","gr58_","gr50_","gr65_","gr50_","gr55_","gr59_","gr54_","gr54_","gr53_","gr56_","gr65_","gr54_","gr50_","gr52_","gr56_","gr56_","gr53_","gr51_","gr52_","gr56_","gr51_","gr56_","gr53_","gr52_","gr51_","gr53_","gr52_","gr49_","gr50_","gr54_","gr56_","gr52_","gr49_","gr54_","gr49_","gr50_","gr50_","gr65_","gr56_","gr49_","gr70_","gr57_","gr53_","gr52_","gr49_","gr65_","gr55_","gr50_","gr52_","gr53_","gr56_","gr56_","gr51_","gr56_","gr54_","gr51_","gr53_","gr51_","gr51_","gr54_","gr55_","gr53_","gr61_"],
|
||||||
|
["gr50_","gr56_","gr54_","gr71_","gr49_","gr62_","gr51_","gr63_","gr50_","gr56_","gr53_","gr54_","gr49_","gr66_","gr50_","gr67_","gr52_","gr25-","rc17_","rc19_","gr26_","gr52_","gr59_","gr51_","gr56_","gr55_","gr53_","gr55_","gr51_","gr52_","gr71_","gr56_","gr55_","gr49_","gr49_","gr51_","gr56_","gr52_","gr55_","gr51_","gr51_","gr51_","gr53_","gr69_","gr53_","gr52_","gr53_","gr53_","gr53_","gr54_","gr50_","gr62_","gr53_","gr54_","gr57_","gr54_","gr53_","gr51_","gr51_","gr56_","gr71_","gr50_","gr60_","gr49_","gr52_","gr51_","gr55_","gr67_","gr54_","gr67_","gr55_","gr53_","gr52_","gr72_","gr55_","gr56_","gr49_","gr63_","gr52_","gr52_","gr53_","gr49_","gr54_","gr49_","gr50_","gr49_","gr51_","gr55_","gr57_","gr56_","gr51_","gr54_","gr51_","gr66_","gr53_","gr54_","gr56_","gr63_","gr56_","gr65_","gr67_","gr51_","gr51_","gr52_","gr51_","gr70_","gr54_","gr65_","gr52_","gr52_","gr54_","gr64_","gr52_","gr61_","gr53_","gr49_","gr55_","gr62_","gr55_","gr52_","gr52_","gr55_","gr55_","gr50_","gr53_","gr51_","gr56_","gr49_","gr51_","gr68_","gr61_","gr52_","gr55_","gr52_","gr65_","gr56_","gr50_","gr69_","gr55_","gr56_","gr54_","gr65_","gr51_","gr49_"],
|
||||||
|
["gr59_","gr51_","gr63_","gr55_","gr59_","gr52_","gr56_","gr55_","gr54_","gr55_","gr70_","gr51_","gr71_","gr54_","gr63_","gr49_","gr53_","gr27-","rc17_","rc18_","gr24_","gr55_","gr51_","gr49_","gr56_","gr53_","gr52_","gr67_","gr64_","gr56_","gr52_","gr56_","gr49_","gr49_","gr52_","gr58_","gr62_","gr51_","gr51_","gr55_","gr64_","gr55_","gr56_","gr49_","gr56_","gr49_","gr49_","gr70_","gr54_","gr65_","gr55_","gr49_","gr54_","gr51_","gr56_","gr56_","gr53_","gr70_","gr51_","gr68_","gr56_","gr56_","gr55_","gr68_","gr54_","gr49_","gr53_","gr50_","gr65_","gr68_","gr49_","gr68_","gr49_","gr50_","gr54_","gr68_","gr56_","gr54_","gr55_","gr49_","gr55_","gr49_","gr54_","gr60_","gr64_","gr56_","gr72_","gr52_","gr50_","gr57_","gr54_","gr50_","gr56_","gr50_","gr54_","gr53_","gr50_","gr50_","gr49_","gr55_","gr51_","gr54_","gr51_","gr54_","gr49_","gr53_","gr62_","gr61_","gr56_","gr52_","gr55_","gr49_","gr55_","gr51_","gr55_","gr52_","gr49_","gr54_","gr59_","gr53_","gr54_","gr53_","gr53_","gr53_","gr55_","gr53_","gr65_","gr51_","gr54_","gr52_","gr56_","gr50_","gr52_","gr49_","gr56_","gr70_","gr56_","gr50_","gr50_","gr51_","gr55_","gr51_","gr51_","gr62_"],
|
||||||
|
["gr54_","gr54_","gr52_","gr65_","gr50_","gr54_","gr50_","gr59_","gr49_","gr67_","gr54_","gr54_","gr54_","gr49_","gr54_","gr55_","gr65_","gr26-","rc16_","rc19_","gr24_","gr53_","gr49_","gr51_","gr63_","gr56_","gr49_","gr54_","gr53_","gr68_","gr50_","gr64_","gr53_","gr50_","gr52_","gr51_","gr66_","gr55_","gr52_","gr63_","gr51_","gr49_","gr51_","gr51_","gr52_","gr54_","gr55_","gr56_","gr51_","gr53_","gr56_","gr55_","gr51_","gr51_","gr52_","gr53_","gr61_","gr63_","gr52_","gr54_","gr50_","gr54_","gr53_","gr55_","gr66_","gr72_","gr55_","gr59_","gr49_","gr49_","gr49_","gr55_","gr52_","gr49_","gr51_","gr54_","gr72_","gr52_","gr51_","gr62_","gr52_","gr51_","gr49_","gr57_","gr50_","gr49_","gr51_","gr61_","gr50_","gr55_","gr50_","gr52_","gr71_","gr49_","gr50_","gr52_","gr55_","gr55_","gr54_","gr56_","gr55_","gr52_","gr50_","gr61_","gr53_","gr50_","gr55_","gr55_","gr53_","gr52_","gr50_","gr50_","gr53_","gr66_","gr53_","gr56_","gr56_","gr49_","gr53_","gr49_","gr62_","gr49_","gr51_","gr71_","gr50_","gr53_","gr51_","gr54_","gr68_","gr54_","gr64_","gr50_","gr53_","gr49_","gr53_","gr49_","gr53_","gr52_","gr69_","gr52_","gr56_","gr53_","gr53_","gr50_"],
|
||||||
|
["gr52_","gr51_","gr53_","gr53_","gr61_","gr51_","gr50_","gr67_","gr66_","gr52_","gr55_","gr63_","gr54_","gr51_","gr55_","gr53_","gr55_","gr26-","rc16_","rc19_","gr27_","gr55_","gr68_","gr49_","gr53_","gr56_","gr55_","gr55_","gr51_","gr55_","gr51_","gr56_","gr60_","gr69_","gr55_","gr55_","gr50_","gr53_","gr51_","gr51_","gr53_","gr56_","gr54_","gr52_","gr56_","gr66_","gr71_","gr50_","gr50_","gr50_","gr53_","gr54_","gr70_","gr54_","gr63_","gr55_","gr51_","gr53_","gr52_","gr71_","gr69_","gr51_","gr52_","gr51_","gr58_","gr64_","gr53_","gr55_","gr54_","gr49_","gr55_","gr55_","gr55_","gr53_","gr49_","gr55_","gr49_","gr58_","gr57_","gr52_","gr52_","gr54_","gr49_","gr56_","gr65_","gr54_","gr52_","gr50_","gr49_","gr51_","gr53_","gr60_","gr54_","gr55_","gr72_","gr52_","gr55_","gr52_","gr71_","gr67_","gr49_","gr54_","gr54_","gr49_","gr72_","gr52_","gr55_","gr55_","gr50_","gr51_","gr55_","gr51_","gr53_","gr51_","gr55_","gr71_","gr52_","gr56_","gr53_","gr59_","gr54_","gr58_","gr56_","gr55_","gr54_","gr53_","gr71_","gr49_","gr52_","gr50_","gr51_","gr69_","gr51_","gr60_","gr56_","gr56_","gr49_","gr52_","gr56_","gr52_","gr50_","gr54_","gr56_","gr55_"],
|
||||||
|
["gr53_","gr49_","gr49_","gr68_","gr54_","gr51_","gr49_","gr56_","gr50_","gr50_","gr63_","gr54_","gr54_","gr52_","gr58_","gr60_","gr56_","gr27-","rc16_","rc19_","gr26_","gr52_","gr54_","gr52_","gr49_","gr53_","gr53_","gr54_","gr50_","gr49_","gr53_","gr57_","gr53_","gr65_","gr55_","gr54_","gr63_","gr55_","gr56_","gr51_","gr54_","gr60_","gr49_","gr51_","gr53_","gr53_","gr64_","gr52_","gr60_","gr49_","gr70_","gr56_","gr53_","gr68_","gr71_","gr53_","gr56_","gr56_","gr53_","gr54_","gr56_","gr54_","gr68_","gr55_","gr52_","gr49_","gr55_","gr52_","gr55_","gr60_","gr50_","gr51_","gr56_","gr55_","gr55_","gr54_","gr59_","gr54_","gr49_","gr50_","gr54_","gr50_","gr52_","gr50_","gr53_","gr54_","gr51_","gr52_","gr55_","gr51_","gr56_","gr59_","gr54_","gr53_","gr55_","gr51_","gr50_","gr51_","gr51_","gr57_","gr55_","gr51_","gr56_","gr56_","gr51_","gr51_","gr55_","gr53_","gr49_","gr49_","gr70_","gr52_","gr56_","gr53_","gr61_","gr65_","gr60_","gr50_","gr50_","gr56_","gr52_","gr56_","gr54_","gr53_","gr51_","gr52_","gr53_","gr53_","gr56_","gr55_","gr50_","gr50_","gr54_","gr51_","gr49_","gr51_","gr52_","gr49_","gr59_","gr50_","gr53_","gr54_","gr54_","gr60_"],
|
||||||
|
["gr49_","gr49_","gr50_","gr53_","gr67_","gr54_","gr69_","gr49_","gr49_","gr54_","gr55_","gr52_","gr71_","gr69_","gr55_","gr51_","gr53_","gr27-","rc17_","rc18_","gr26_","gr52_","gr53_","gr67_","gr52_","gr56_","gr66_","gr52_","gr49_","gr51_","gr49_","gr49_","gr50_","gr54_","gr50_","gr54_","gr49_","gr68_","gr51_","gr56_","gr69_","gr54_","gr68_","gr49_","gr67_","gr71_","gr51_","gr55_","gr56_","gr57_","gr50_","gr53_","gr49_","gr54_","gr53_","gr56_","gr52_","gr56_","gr53_","gr51_","gr52_","gr50_","gr55_","gr68_","gr49_","gr52_","gr53_","gr53_","gr54_","gr51_","gr52_","gr52_","gr49_","gr54_","gr52_","gr51_","gr54_","gr67_","gr51_","gr56_","gr52_","gr56_","gr51_","gr54_","gr54_","gr50_","gr71_","gr58_","gr51_","gr49_","gr50_","gr55_","gr55_","gr50_","gr49_","gr51_","gr72_","gr52_","gr51_","gr56_","gr50_","gr51_","gr56_","gr52_","gr67_","gr56_","gr55_","gr50_","gr56_","gr55_","gr71_","gr54_","gr54_","gr56_","gr55_","gr52_","gr50_","gr63_","gr53_","gr50_","gr49_","gr52_","gr51_","gr65_","gr49_","gr51_","gr53_","gr56_","gr54_","gr61_","gr53_","gr49_","gr53_","gr53_","gr56_","gr51_","gr69_","gr51_","gr54_","gr54_","gr49_","gr53_","gr61_","gr66_"],
|
||||||
|
["gr56_","gr57_","gr54_","gr64_","gr53_","gr69_","gr55_","gr55_","gr55_","gr55_","gr55_","gr56_","gr49_","gr53_","gr69_","gr51_","gr51_","gr27-","rc17_","rc19_","gr26_","gr71_","gr50_","gr54_","gr54_","gr56_","gr55_","gr56_","gr58_","gr60_","gr71_","gr51_","gr49_","gr52_","gr49_","gr49_","gr55_","gr52_","gr59_","gr49_","gr52_","gr53_","gr55_","gr52_","gr50_","gr49_","gr49_","gr50_","gr56_","gr66_","gr50_","gr51_","gr58_","gr51_","gr72_","gr55_","gr55_","gr54_","gr52_","gr55_","gr49_","gr52_","gr51_","gr65_","gr49_","gr56_","gr54_","gr55_","gr49_","gr61_","gr51_","gr56_","gr56_","gr51_","gr49_","gr62_","gr49_","gr54_","gr55_","gr71_","gr52_","gr55_","gr62_","gr52_","gr51_","gr49_","gr50_","gr53_","gr55_","gr52_","gr53_","gr51_","gr57_","gr54_","gr52_","gr52_","gr49_","gr69_","gr56_","gr51_","gr50_","gr55_","gr54_","gr53_","gr51_","gr50_","gr55_","gr53_","gr64_","gr52_","gr49_","gr56_","gr71_","gr60_","gr52_","gr58_","gr52_","gr55_","gr54_","gr56_","gr53_","gr69_","gr56_","gr52_","gr55_","gr49_","gr55_","gr52_","gr55_","gr52_","gr52_","gr67_","gr50_","gr50_","gr60_","gr63_","gr70_","gr51_","gr64_","gr49_","gr62_","gr52_","gr54_","gr72_"],
|
||||||
|
["gr49_","gr52_","gr54_","gr54_","gr52_","gr55_","gr54_","gr64_","gr52_","gr70_","gr55_","gr51_","gr52_","gr53_","gr54_","gr50_","gr53_","gr26-","rc16_","rc18_","gr26_","gr54_","gr53_","gr54_","gr55_","gr53_","gr53_","gr50_","gr59_","gr52_","gr54_","gr52_","gr51_","gr52_","gr67_","gr54_","gr51_","gr56_","gr49_","gr54_","gr49_","gr57_","gr49_","gr63_","gr49_","gr50_","gr56_","gr61_","gr50_","gr53_","gr54_","gr68_","gr64_","gr52_","gr50_","gr58_","gr56_","gr56_","gr52_","gr56_","gr55_","gr54_","gr50_","gr54_","gr52_","gr53_","gr52_","gr52_","gr49_","gr50_","gr56_","gr57_","gr54_","gr53_","gr54_","gr56_","gr61_","gr49_","gr53_","gr53_","gr55_","gr55_","gr52_","gr69_","gr54_","gr51_","gr50_","gr52_","gr49_","gr53_","gr55_","gr60_","gr51_","gr49_","gr56_","gr53_","gr60_","gr56_","gr55_","gr71_","gr54_","gr54_","gr49_","gr49_","gr50_","gr50_","gr71_","gr54_","gr49_","gr49_","gr53_","gr51_","gr51_","gr50_","gr54_","gr50_","gr59_","gr51_","gr53_","gr58_","gr56_","gr51_","gr53_","gr53_","gr54_","gr70_","gr50_","gr49_","gr59_","gr52_","gr54_","gr55_","gr51_","gr50_","gr54_","gr55_","gr53_","gr72_","gr50_","gr50_","gr51_","gr50_","gr49_","gr54_"],
|
||||||
|
["gr70_","gr63_","gr50_","gr53_","gr55_","gr52_","gr68_","gr55_","gr55_","gr50_","gr54_","gr51_","gr56_","gr52_","gr56_","gr50_","gr50_","gr26-","rc17_","rc19_","gr26_","gr56_","gr54_","gr50_","gr55_","gr56_","gr49_","gr51_","gr69_","gr52_","gr56_","gr54_","gr56_","gr61_","gr50_","gr54_","gr51_","gr63_","gr53_","gr56_","gr53_","gr50_","gr67_","gr55_","gr50_","gr51_","gr72_","gr57_","gr56_","gr56_","gr62_","gr56_","gr50_","gr56_","gr49_","gr50_","gr57_","gr57_","gr52_","gr49_","gr54_","gr64_","gr50_","gr51_","gr49_","gr52_","gr53_","gr59_","gr54_","gr51_","gr50_","gr54_","gr50_","gr52_","gr51_","gr64_","gr50_","gr51_","gr52_","gr53_","gr53_","gr56_","gr55_","gr56_","gr53_","gr56_","gr56_","gr55_","gr66_","gr51_","gr49_","gr68_","gr54_","gr52_","gr71_","gr54_","gr50_","gr61_","gr51_","gr54_","gr56_","gr56_","gr66_","gr50_","gr55_","gr54_","gr54_","gr62_","gr50_","gr52_","gr51_","gr54_","gr49_","gr65_","gr51_","gr53_","gr55_","gr50_","gr50_","gr49_","gr50_","gr54_","gr58_","gr53_","gr54_","gr50_","gr56_","gr53_","gr50_","gr54_","gr53_","gr54_","gr65_","gr54_","gr62_","gr51_","gr51_","gr51_","gr52_","gr49_","gr49_","gr55_","gr61_","gr52_"],
|
||||||
|
["gr53_","gr52_","gr50_","gr72_","gr72_","gr53_","gr55_","gr49_","gr57_","gr51_","gr54_","gr50_","gr53_","gr50_","gr60_","gr50_","gr49_","gr26-","rc16_","rc18_","gr26_","gr70_","gr53_","gr50_","gr54_","gr56_","gr54_","gr49_","gr56_","gr51_","gr51_","gr56_","gr64_","gr55_","gr52_","gr55_","gr64_","gr49_","gr55_","gr54_","gr56_","gr49_","gr53_","gr54_","gr51_","gr50_","gr51_","gr53_","gr64_","gr54_","gr50_","gr53_","gr66_","gr55_","gr55_","gr53_","gr64_","gr54_","gr51_","gr71_","gr54_","gr56_","gr60_","gr49_","gr50_","gr52_","gr50_","gr52_","gr71_","gr55_","gr51_","gr72_","gr54_","gr56_","gr56_","gr54_","gr56_","gr52_","gr61_","gr52_","gr53_","gr51_","gr53_","gr53_","gr49_","gr49_","gr52_","gr62_","gr49_","gr54_","gr51_","gr50_","gr51_","gr55_","gr56_","gr55_","gr51_","gr50_","gr51_","gr71_","gr54_","gr54_","gr50_","gr56_","gr51_","gr56_","gr61_","gr52_","gr61_","gr55_","gr51_","gr49_","gr66_","gr50_","gr51_","gr50_","gr55_","gr68_","gr60_","gr52_","gr50_","gr55_","gr54_","gr66_","gr63_","gr54_","gr55_","gr50_","gr60_","gr50_","gr63_","gr54_","gr52_","gr54_","gr52_","gr52_","gr55_","gr50_","gr70_","gr54_","gr57_","gr52_","gr60_","gr51_"],
|
||||||
|
["gr55_","gr50_","gr53_","gr52_","gr53_","gr49_","gr56_","gr56_","gr50_","gr49_","gr53_","gr56_","gr66_","gr55_","gr49_","gr59_","gr51_","gr27-","rc16_","rc19_","gr24_","gr71_","gr49_","gr54_","gr51_","gr53_","gr50_","gr55_","gr52_","gr49_","gr64_","gr50_","gr66_","gr51_","gr50_","gr51_","gr50_","gr55_","gr55_","gr56_","gr50_","gr53_","gr71_","gr51_","gr69_","gr49_","gr55_","gr49_","gr67_","gr52_","gr57_","gr53_","gr54_","gr49_","gr50_","gr53_","gr54_","gr49_","gr58_","gr52_","gr54_","gr56_","gr55_","gr55_","gr53_","gr61_","gr51_","gr56_","gr54_","gr70_","gr57_","gr54_","gr56_","gr50_","gr60_","gr59_","gr55_","gr53_","gr56_","gr52_","gr49_","gr55_","gr55_","gr52_","gr50_","gr53_","gr53_","gr50_","gr72_","gr71_","gr53_","gr71_","gr55_","gr56_","gr50_","gr49_","gr55_","gr49_","gr70_","gr50_","gr49_","gr54_","gr55_","gr49_","gr70_","gr56_","gr52_","gr56_","gr56_","gr49_","gr68_","gr52_","gr54_","gr52_","gr56_","gr49_","gr53_","gr50_","gr52_","gr52_","gr50_","gr53_","gr51_","gr54_","gr56_","gr57_","gr56_","gr72_","gr56_","gr70_","gr69_","gr49_","gr68_","gr56_","gr71_","gr49_","gr51_","gr55_","gr72_","gr50_","gr56_","gr63_","gr52_","gr50_"],
|
||||||
|
["gr51_","gr49_","gr53_","gr51_","gr55_","gr56_","gr55_","gr51_","gr50_","gr69_","gr52_","gr60_","gr56_","gr52_","gr49_","gr52_","gr72_","gr27-","rc17_","rc18_","gr26_","gr51_","gr51_","gr55_","gr55_","gr64_","gr55_","gr50_","gr56_","gr71_","gr55_","gr53_","gr55_","gr56_","gr52_","gr50_","gr56_","gr56_","gr52_","gr55_","gr50_","gr62_","gr56_","gr54_","gr56_","gr56_","gr69_","gr61_","gr56_","gr52_","gr52_","gr55_","gr55_","gr55_","gr50_","gr50_","gr59_","gr49_","gr49_","gr63_","gr55_","gr71_","gr69_","gr53_","gr51_","gr56_","gr71_","gr54_","gr49_","gr49_","gr53_","gr72_","gr49_","gr49_","gr56_","gr54_","gr54_","gr53_","gr53_","gr52_","gr55_","gr53_","gr53_","gr54_","gr55_","gr60_","gr53_","gr66_","gr54_","gr52_","gr54_","gr49_","gr53_","gr65_","gr54_","gr51_","gr53_","gr57_","gr53_","gr64_","gr49_","gr51_","gr57_","gr55_","gr72_","gr52_","gr51_","gr50_","gr60_","gr51_","gr56_","gr56_","gr69_","gr55_","gr49_","gr50_","gr55_","gr51_","gr59_","gr55_","gr56_","gr49_","gr55_","gr49_","gr67_","gr52_","gr51_","gr53_","gr55_","gr52_","gr55_","gr54_","gr56_","gr54_","gr49_","gr51_","gr61_","gr49_","gr49_","gr53_","gr49_","gr51_","gr54_","gr65_"],
|
||||||
|
["gr51_","gr58_","gr56_","gr52_","gr54_","gr51_","gr52_","gr50_","gr49_","gr54_","gr51_","gr54_","gr55_","gr56_","gr66_","gr53_","gr56_","gr26-","rc16_","rc19_","gr26_","gr50_","gr51_","gr60_","gr50_","gr56_","gr51_","gr52_","gr53_","gr51_","gr71_","gr56_","gr56_","gr54_","gr58_","gr51_","gr52_","gr52_","gr64_","gr66_","gr49_","gr53_","gr50_","gr56_","gr51_","gr53_","gr53_","gr50_","gr65_","gr53_","gr67_","gr52_","gr53_","gr56_","gr49_","gr67_","gr54_","gr63_","gr64_","gr49_","gr49_","gr54_","gr52_","gr60_","gr68_","gr52_","gr56_","gr54_","gr49_","gr55_","gr55_","gr55_","gr57_","gr53_","gr52_","gr55_","gr54_","gr52_","gr52_","gr53_","gr56_","gr59_","gr55_","gr50_","gr50_","gr55_","gr50_","gr54_","gr50_","gr56_","gr56_","gr50_","gr52_","gr49_","gr68_","gr53_","gr55_","gr51_","gr56_","gr56_","gr62_","gr50_","gr50_","gr49_","gr56_","gr54_","gr50_","gr51_","gr49_","gr52_","gr53_","gr52_","gr55_","gr51_","gr53_","gr54_","gr62_","gr55_","gr62_","gr55_","gr52_","gr50_","gr59_","gr49_","gr54_","gr53_","gr63_","gr51_","gr65_","gr67_","gr52_","gr70_","gr50_","gr63_","gr56_","gr49_","gr62_","gr49_","gr59_","gr53_","gr51_","gr61_","gr50_","gr49_"],
|
||||||
|
["gr53_","gr52_","gr55_","gr55_","gr49_","gr49_","gr54_","gr69_","gr54_","gr53_","gr49_","gr54_","gr55_","gr51_","gr53_","gr55_","gr51_","gr27-","rc17_","rc19_","gr24_","gr61_","gr49_","gr54_","gr60_","gr53_","gr71_","gr52_","gr52_","gr56_","gr50_","gr51_","gr51_","gr62_","gr52_","gr54_","gr52_","gr68_","gr49_","gr49_","gr55_","gr49_","gr67_","gr55_","gr56_","gr50_","gr55_","gr55_","gr52_","gr71_","gr54_","gr51_","gr55_","gr53_","gr54_","gr56_","gr49_","gr50_","gr54_","gr56_","gr52_","gr51_","gr53_","gr51_","gr55_","gr49_","gr52_","gr57_","gr54_","gr56_","gr55_","gr50_","gr56_","gr55_","gr56_","gr62_","gr64_","gr51_","gr68_","gr53_","gr52_","gr51_","gr68_","gr49_","gr49_","gr53_","gr61_","gr55_","gr53_","gr56_","gr49_","gr50_","gr51_","gr72_","gr52_","gr55_","gr59_","gr54_","gr55_","gr50_","gr71_","gr53_","gr64_","gr56_","gr56_","gr70_","gr56_","gr50_","gr63_","gr52_","gr52_","gr57_","gr52_","gr49_","gr53_","gr68_","gr50_","gr55_","gr56_","gr52_","gr56_","gr72_","gr55_","gr72_","gr50_","gr54_","gr53_","gr57_","gr54_","gr52_","gr54_","gr56_","gr64_","gr51_","gr53_","gr51_","gr54_","gr54_","gr52_","gr60_","gr53_","gr55_","gr56_","gr49_"],
|
||||||
|
["gr50_","gr55_","gr49_","gr61_","gr58_","gr50_","gr54_","gr53_","gr51_","gr56_","gr56_","gr52_","gr56_","gr62_","gr50_","gr64_","gr56_","gr27-","rc16_","rc19_","gr27_","gr51_","gr53_","gr51_","gr53_","gr55_","gr50_","gr58_","gr58_","gr51_","gr54_","gr55_","gr56_","gr55_","gr49_","gr51_","gr49_","gr55_","gr56_","gr52_","gr52_","gr58_","gr52_","gr70_","gr53_","gr55_","gr51_","gr53_","gr50_","gr51_","gr61_","gr52_","gr63_","gr52_","gr56_","gr49_","gr50_","gr50_","gr52_","gr54_","gr71_","gr56_","gr72_","gr50_","gr70_","gr56_","gr60_","gr54_","gr56_","gr52_","gr53_","gr49_","gr53_","gr70_","gr52_","gr52_","gr49_","gr49_","gr54_","gr70_","gr67_","gr53_","gr53_","gr58_","gr53_","gr55_","gr54_","gr52_","gr71_","gr54_","gr50_","gr55_","gr51_","gr55_","gr61_","gr50_","gr50_","gr50_","gr50_","gr55_","gr54_","gr51_","gr52_","gr50_","gr54_","gr50_","gr55_","gr72_","gr53_","gr52_","gr53_","gr53_","gr51_","gr56_","gr49_","gr53_","gr50_","gr50_","gr56_","gr52_","gr59_","gr59_","gr58_","gr54_","gr55_","gr55_","gr54_","gr56_","gr54_","gr54_","gr51_","gr68_","gr51_","gr51_","gr56_","gr57_","gr53_","gr56_","gr53_","gr49_","gr64_","gr72_","gr55_","gr50_"],
|
||||||
|
["gr58_","gr52_","gr56_","gr53_","gr55_","gr55_","gr52_","gr50_","gr54_","gr49_","gr54_","gr57_","gr49_","gr56_","gr49_","gr51_","gr49_","gr25-","rc17_","rc19_","gr26_","gr61_","gr54_","gr53_","gr52_","gr55_","gr54_","gr55_","gr50_","gr54_","gr52_","gr51_","gr49_","gr57_","gr50_","gr51_","gr67_","gr53_","gr69_","gr52_","gr72_","gr49_","gr53_","gr50_","gr51_","gr58_","gr56_","gr51_","gr51_","gr64_","gr55_","gr63_","gr51_","gr55_","gr56_","gr55_","gr50_","gr55_","gr59_","gr59_","gr52_","gr53_","gr53_","gr50_","gr55_","gr56_","gr56_","gr53_","gr54_","gr60_","gr56_","gr52_","gr50_","gr50_","gr55_","gr56_","gr52_","gr54_","gr50_","gr56_","gr52_","gr55_","gr50_","gr53_","gr54_","gr51_","gr53_","gr53_","gr55_","gr49_","gr50_","gr59_","gr68_","gr53_","gr49_","gr69_","gr52_","gr56_","gr56_","gr61_","gr49_","gr53_","gr54_","gr50_","gr51_","gr52_","gr61_","gr52_","gr52_","gr59_","gr56_","gr50_","gr61_","gr56_","gr49_","gr55_","gr64_","gr56_","gr53_","gr49_","gr68_","gr52_","gr54_","gr49_","gr52_","gr54_","gr56_","gr55_","gr56_","gr49_","gr52_","gr51_","gr59_","gr54_","gr64_","gr52_","gr51_","gr56_","gr69_","gr52_","gr52_","gr57_","gr56_","gr66_"],
|
||||||
|
["gr53_","gr50_","gr50_","gr55_","gr49_","gr55_","gr64_","gr50_","gr56_","gr56_","gr68_","gr53_","gr51_","gr49_","gr50_","gr53_","gr60_","gr26-","rc17_","rc19_","gr24_","gr49_","gr53_","gr52_","gr50_","gr68_","gr49_","gr50_","gr51_","gr56_","gr60_","gr55_","gr52_","gr53_","gr55_","gr53_","gr50_","gr62_","gr71_","gr49_","gr51_","gr61_","gr54_","gr53_","gr50_","gr53_","gr55_","gr49_","gr63_","gr55_","gr54_","gr53_","gr52_","gr70_","gr54_","gr49_","gr65_","gr50_","gr49_","gr53_","gr49_","gr49_","gr51_","gr49_","gr67_","gr49_","gr63_","gr55_","gr50_","gr55_","gr65_","gr52_","gr61_","gr52_","gr50_","gr67_","gr56_","gr50_","gr72_","gr50_","gr49_","gr51_","gr51_","gr66_","gr51_","gr59_","gr49_","gr51_","gr55_","gr65_","gr51_","gr54_","gr54_","gr58_","gr54_","gr49_","gr56_","gr62_","gr50_","gr55_","gr65_","gr49_","gr54_","gr53_","gr55_","gr59_","gr67_","gr54_","gr61_","gr49_","gr68_","gr56_","gr58_","gr50_","gr52_","gr68_","gr50_","gr50_","gr56_","gr50_","gr68_","gr50_","gr49_","gr67_","gr51_","gr53_","gr51_","gr54_","gr53_","gr61_","gr65_","gr52_","gr55_","gr69_","gr55_","gr51_","gr55_","gr52_","gr54_","gr62_","gr49_","gr56_","gr67_","gr51_"],
|
||||||
|
["gr51_","gr49_","gr56_","gr60_","gr56_","gr50_","gr50_","gr63_","gr56_","gr51_","gr50_","gr70_","gr55_","gr50_","gr52_","gr56_","gr50_","gr25-","rc17_","rc18_","gr25_","gr57_","gr50_","gr70_","gr55_","gr55_","gr68_","gr52_","gr52_","gr49_","gr54_","gr52_","gr50_","gr50_","gr56_","gr49_","gr53_","gr51_","gr56_","gr49_","gr52_","gr54_","gr54_","gr54_","gr50_","gr63_","gr56_","gr71_","gr53_","gr54_","gr56_","gr69_","gr50_","gr55_","gr49_","gr55_","gr55_","gr58_","gr54_","gr54_","gr55_","gr52_","gr52_","gr50_","gr50_","gr51_","gr51_","gr51_","gr50_","gr62_","gr56_","gr64_","gr55_","gr51_","gr53_","gr52_","gr60_","gr54_","gr56_","gr52_","gr56_","gr49_","gr56_","gr66_","gr54_","gr62_","gr52_","gr53_","gr53_","gr55_","gr67_","gr62_","gr49_","gr55_","gr69_","gr53_","gr72_","gr54_","gr56_","gr50_","gr54_","gr49_","gr52_","gr53_","gr49_","gr56_","gr56_","gr54_","gr61_","gr54_","gr50_","gr53_","gr50_","gr52_","gr60_","gr52_","gr65_","gr55_","gr49_","gr56_","gr51_","gr53_","gr52_","gr52_","gr50_","gr60_","gr49_","gr53_","gr54_","gr51_","gr50_","gr63_","gr49_","gr54_","gr51_","gr54_","gr51_","gr71_","gr54_","gr54_","gr62_","gr56_","gr64_","gr52_"],
|
||||||
|
["gr67_","gr49_","gr66_","gr51_","gr52_","gr72_","gr50_","gr72_","gr64_","gr52_","gr55_","gr62_","gr50_","gr66_","gr56_","gr51_","gr58_","gr25-","rc16_","rc19_","gr24_","gr53_","gr53_","gr53_","gr51_","gr55_","gr55_","gr51_","gr54_","gr50_","gr49_","gr57_","gr51_","gr56_","gr53_","gr55_","gr54_","gr51_","gr54_","gr54_","gr52_","gr69_","gr54_","gr62_","gr50_","gr49_","gr51_","gr62_","gr62_","gr55_","gr54_","gr56_","gr52_","gr52_","gr51_","gr50_","gr67_","gr72_","gr52_","gr54_","gr62_","gr54_","gr70_","gr50_","gr51_","gr55_","gr50_","gr49_","gr63_","gr55_","gr53_","gr49_","gr56_","gr55_","gr56_","gr51_","gr49_","gr49_","gr49_","gr54_","gr50_","gr55_","gr49_","gr52_","gr53_","gr53_","gr52_","gr51_","gr50_","gr50_","gr52_","gr53_","gr52_","gr51_","gr53_","gr49_","gr50_","gr64_","gr50_","gr56_","gr55_","gr53_","gr55_","gr49_","gr67_","gr50_","gr54_","gr53_","gr55_","gr51_","gr67_","gr51_","gr52_","gr57_","gr55_","gr53_","gr53_","gr55_","gr56_","gr50_","gr49_","gr54_","gr55_","gr50_","gr50_","gr49_","gr56_","gr53_","gr64_","gr50_","gr54_","gr52_","gr55_","gr51_","gr69_","gr54_","gr53_","gr54_","gr54_","gr53_","gr53_","gr70_","gr55_","gr54_"],
|
||||||
|
["gr54_","gr51_","gr56_","gr52_","gr68_","gr50_","gr55_","gr54_","gr54_","gr51_","gr53_","gr52_","gr55_","gr57_","gr63_","gr54_","gr54_","gr25-","rc16_","rc18_","gr25_","gr67_","gr54_","gr49_","gr54_","gr68_","gr50_","gr49_","gr49_","gr58_","gr63_","gr54_","gr55_","gr55_","gr53_","gr56_","gr51_","gr55_","gr50_","gr55_","gr51_","gr49_","gr54_","gr52_","gr51_","gr50_","gr56_","gr53_","gr51_","gr50_","gr71_","gr52_","gr60_","gr52_","gr50_","gr64_","gr54_","gr50_","gr49_","gr51_","gr53_","gr56_","gr66_","gr51_","gr56_","gr52_","gr69_","gr50_","gr65_","gr52_","gr56_","gr53_","gr55_","gr56_","gr51_","gr56_","gr63_","gr52_","gr53_","gr49_","gr55_","gr55_","gr53_","gr56_","gr49_","gr55_","gr50_","gr54_","gr54_","gr50_","gr52_","gr59_","gr56_","gr62_","gr56_","gr53_","gr63_","gr51_","gr56_","gr56_","gr54_","gr51_","gr65_","gr49_","gr59_","gr49_","gr51_","gr50_","gr50_","gr55_","gr52_","gr66_","gr50_","gr54_","gr62_","gr49_","gr54_","gr50_","gr52_","gr72_","gr53_","gr52_","gr49_","gr55_","gr51_","gr54_","gr50_","gr53_","gr54_","gr66_","gr54_","gr60_","gr50_","gr52_","gr53_","gr50_","gr53_","gr51_","gr54_","gr49_","gr68_","gr52_","gr56_","gr72_"],
|
||||||
|
["gr68_","gr55_","gr50_","gr56_","gr50_","gr63_","gr50_","gr55_","gr52_","gr54_","gr50_","gr49_","gr53_","gr55_","gr54_","gr50_","gr52_","gr25-","rc17_","rc18_","gr24_","gr53_","gr61_","gr64_","gr55_","gr54_","gr53_","gr54_","gr53_","gr50_","gr62_","gr59_","gr62_","gr56_","gr49_","gr52_","gr53_","gr69_","gr52_","gr52_","gr49_","gr66_","gr54_","gr56_","gr70_","gr58_","gr54_","gr52_","gr50_","gr53_","gr53_","gr51_","gr56_","gr64_","gr63_","gr52_","gr65_","gr50_","gr55_","gr55_","gr54_","gr49_","gr56_","gr52_","gr55_","gr67_","gr52_","gr52_","gr55_","gr53_","gr64_","gr54_","gr54_","gr55_","gr62_","gr52_","gr54_","gr54_","gr50_","gr51_","gr54_","gr49_","gr69_","gr55_","gr50_","gr52_","gr69_","gr52_","gr65_","gr56_","gr52_","gr54_","gr54_","gr49_","gr69_","gr50_","gr55_","gr55_","gr66_","gr51_","gr49_","gr53_","gr72_","gr54_","gr66_","gr61_","gr56_","gr54_","gr53_","gr51_","gr56_","gr56_","gr50_","gr53_","gr49_","gr64_","gr51_","gr65_","gr55_","gr50_","gr49_","gr55_","gr52_","gr58_","gr53_","gr51_","gr69_","gr53_","gr55_","gr52_","gr51_","gr54_","gr50_","gr63_","gr51_","gr50_","gr53_","gr61_","gr54_","gr52_","gr52_","gr49_","gr50_","gr50_"],
|
||||||
|
["gr53_","gr51_","gr55_","gr70_","gr52_","gr56_","gr51_","gr54_","gr55_","gr55_","gr55_","gr52_","gr59_","gr53_","gr72_","gr54_","gr53_","gr24-","rc16_","rc19_","gr27_","gr58_","gr65_","gr52_","gr64_","gr62_","gr55_","gr56_","gr50_","gr56_","gr55_","gr49_","gr55_","gr50_","gr49_","gr49_","gr52_","gr56_","gr51_","gr54_","gr54_","gr49_","gr54_","gr50_","gr56_","gr49_","gr55_","gr52_","gr59_","gr50_","gr54_","gr53_","gr65_","gr55_","gr50_","gr67_","gr49_","gr56_","gr52_","gr66_","gr55_","gr65_","gr55_","gr70_","gr49_","gr58_","gr54_","gr50_","gr51_","gr57_","gr54_","gr52_","gr51_","gr51_","gr56_","gr62_","gr53_","gr55_","gr49_","gr71_","gr49_","gr51_","gr49_","gr56_","gr56_","gr60_","gr55_","gr72_","gr50_","gr51_","gr51_","gr64_","gr51_","gr51_","gr51_","gr63_","gr50_","gr60_","gr55_","gr55_","gr49_","gr67_","gr53_","gr55_","gr56_","gr55_","gr69_","gr55_","gr49_","gr53_","gr54_","gr55_","gr61_","gr53_","gr55_","gr56_","gr62_","gr51_","gr55_","gr57_","gr51_","gr56_","gr70_","gr52_","gr55_","gr54_","gr50_","gr54_","gr50_","gr55_","gr51_","gr50_","gr54_","gr54_","gr62_","gr55_","gr52_","gr52_","gr62_","gr54_","gr53_","gr53_","gr54_","gr53_"],
|
||||||
|
["gr49_","gr57_","gr49_","gr54_","gr51_","gr52_","gr50_","gr56_","gr50_","gr61_","gr52_","gr53_","gr50_","gr58_","gr52_","gr50_","gr49_","gr25-","rc17_","rc19_","gr27_","gr51_","gr51_","gr52_","gr55_","gr51_","gr49_","gr65_","gr55_","gr54_","gr50_","gr55_","gr52_","gr70_","gr53_","gr49_","gr55_","gr53_","gr49_","gr68_","gr49_","gr52_","gr54_","gr51_","gr52_","gr64_","gr49_","gr52_","gr56_","gr56_","gr52_","gr56_","gr71_","gr57_","gr51_","gr55_","gr49_","gr50_","gr56_","gr50_","gr49_","gr49_","gr49_","gr55_","gr54_","gr52_","gr53_","gr49_","gr51_","gr56_","gr50_","gr53_","gr55_","gr53_","gr50_","gr54_","gr54_","gr55_","gr49_","gr50_","gr62_","gr55_","gr49_","gr67_","gr50_","gr56_","gr54_","gr55_","gr51_","gr51_","gr59_","gr56_","gr50_","gr52_","gr51_","gr53_","gr71_","gr51_","gr72_","gr55_","gr62_","gr51_","gr63_","gr52_","gr52_","gr54_","gr50_","gr71_","gr54_","gr71_","gr53_","gr54_","gr51_","gr55_","gr50_","gr51_","gr53_","gr49_","gr53_","gr52_","gr52_","gr53_","gr56_","gr52_","gr50_","gr57_","gr56_","gr55_","gr72_","gr51_","gr54_","gr49_","gr56_","gr49_","gr56_","gr56_","gr49_","gr65_","gr53_","gr53_","gr54_","gr49_","gr52_","gr55_"],
|
||||||
|
["gr55_","gr56_","gr62_","gr49_","gr55_","gr51_","gr63_","gr55_","gr52_","gr65_","gr49_","gr52_","gr66_","gr55_","gr57_","gr55_","gr56_","gr26-","rc17_","rc19_","gr26_","gr55_","gr51_","gr57_","gr53_","gr53_","gr67_","gr56_","gr53_","gr51_","gr54_","gr54_","gr51_","gr50_","gr69_","gr51_","gr56_","gr62_","gr52_","gr54_","gr51_","gr62_","gr53_","gr50_","gr49_","gr54_","gr53_","gr52_","gr55_","gr72_","gr53_","gr54_","gr50_","gr55_","gr66_","gr55_","gr56_","gr50_","gr53_","gr65_","gr52_","gr71_","gr52_","gr57_","gr54_","gr54_","gr55_","gr51_","gr72_","gr50_","gr52_","gr67_","gr50_","gr51_","gr52_","gr53_","gr63_","gr55_","gr52_","gr54_","gr54_","gr52_","gr53_","gr49_","gr66_","gr55_","gr52_","gr51_","gr50_","gr49_","gr50_","gr55_","gr50_","gr53_","gr69_","gr50_","gr64_","gr67_","gr69_","gr56_","gr55_","gr55_","gr56_","gr62_","gr56_","gr51_","gr71_","gr54_","gr52_","gr49_","gr54_","gr54_","gr51_","gr50_","gr56_","gr56_","gr49_","gr50_","gr49_","gr52_","gr52_","gr49_","gr58_","gr66_","gr55_","gr51_","gr49_","gr56_","gr49_","gr49_","gr54_","gr66_","gr54_","gr54_","gr71_","gr53_","gr53_","gr51_","gr52_","gr59_","gr49_","gr52_","gr60_","gr51_"],
|
||||||
|
["gr72_","gr56_","gr55_","gr53_","gr63_","gr53_","gr49_","gr66_","gr52_","gr50_","gr53_","gr58_","gr51_","gr51_","gr56_","gr68_","gr50_","gr25-","rc16_","rc18_","gr27_","gr54_","gr65_","gr50_","gr49_","gr53_","gr53_","gr54_","gr53_","gr72_","gr53_","gr69_","gr53_","gr56_","gr56_","gr56_","gr69_","gr50_","gr61_","gr53_","gr52_","gr52_","gr60_","gr71_","gr54_","gr68_","gr50_","gr53_","gr50_","gr49_","gr49_","gr71_","gr49_","gr55_","gr54_","gr52_","gr53_","gr64_","gr50_","gr54_","gr64_","gr54_","gr49_","gr52_","gr56_","gr50_","gr53_","gr55_","gr58_","gr55_","gr52_","gr54_","gr52_","gr64_","gr54_","gr50_","gr49_","gr70_","gr72_","gr66_","gr49_","gr51_","gr60_","gr49_","gr54_","gr50_","gr55_","gr51_","gr56_","gr68_","gr49_","gr52_","gr50_","gr52_","gr72_","gr56_","gr51_","gr52_","gr54_","gr52_","gr54_","gr71_","gr54_","gr52_","gr50_","gr52_","gr51_","gr66_","gr59_","gr49_","gr49_","gr70_","gr55_","gr54_","gr50_","gr64_","gr58_","gr54_","gr50_","gr55_","gr50_","gr49_","gr52_","gr54_","gr52_","gr53_","gr51_","gr50_","gr53_","gr56_","gr49_","gr54_","gr49_","gr55_","gr68_","gr55_","gr56_","gr50_","gr51_","gr55_","gr60_","gr54_","gr53_","gr54_"],
|
||||||
|
["gr53_","gr58_","gr51_","gr53_","gr53_","gr51_","gr58_","gr49_","gr52_","gr56_","gr50_","gr54_","gr60_","gr54_","gr49_","gr49_","gr54_","gr24-","rc17_","rc19_","gr27_","gr49_","gr60_","gr55_","gr53_","gr50_","gr55_","gr50_","gr52_","gr52_","gr69_","gr52_","gr49_","gr64_","gr56_","gr54_","gr55_","gr49_","gr52_","gr72_","gr52_","gr56_","gr67_","gr51_","gr68_","gr56_","gr50_","gr53_","gr55_","gr51_","gr50_","gr49_","gr70_","gr52_","gr56_","gr61_","gr49_","gr50_","gr54_","gr50_","gr52_","gr59_","gr56_","gr63_","gr53_","gr55_","gr55_","gr53_","gr56_","gr56_","gr65_","gr52_","gr52_","gr65_","gr55_","gr53_","gr52_","gr52_","gr54_","gr55_","gr54_","gr50_","gr55_","gr51_","gr55_","gr64_","gr55_","gr55_","gr53_","gr52_","gr56_","gr55_","gr51_","gr60_","gr54_","gr55_","gr49_","gr63_","gr50_","gr50_","gr49_","gr49_","gr50_","gr54_","gr59_","gr51_","gr55_","gr53_","gr50_","gr57_","gr54_","gr54_","gr69_","gr51_","gr64_","gr50_","gr55_","gr53_","gr50_","gr55_","gr64_","gr55_","gr53_","gr57_","gr49_","gr53_","gr63_","gr52_","gr67_","gr56_","gr56_","gr51_","gr49_","gr67_","gr54_","gr53_","gr50_","gr71_","gr50_","gr50_","gr56_","gr56_","gr57_","gr66_"],
|
||||||
|
["gr51_","gr53_","gr52_","gr54_","gr55_","gr52_","gr56_","gr61_","gr50_","gr51_","gr54_","gr56_","gr55_","gr56_","gr52_","gr55_","gr53_","gr24-","rc17_","rc18_","gr26_","gr54_","gr62_","gr72_","gr55_","gr52_","gr56_","gr52_","gr53_","gr63_","gr55_","gr51_","gr49_","gr56_","gr51_","gr55_","gr54_","gr52_","gr49_","gr55_","gr59_","gr49_","gr50_","gr53_","gr51_","gr52_","gr51_","gr55_","gr54_","gr54_","gr54_","gr54_","gr55_","gr67_","gr56_","gr50_","gr52_","gr50_","gr50_","gr51_","gr65_","gr56_","gr56_","gr50_","gr62_","gr53_","gr53_","gr54_","gr68_","gr61_","gr53_","gr63_","gr51_","gr56_","gr57_","gr55_","gr55_","gr58_","gr54_","gr52_","gr55_","gr52_","gr54_","gr71_","gr53_","gr49_","gr54_","gr56_","gr56_","gr50_","gr71_","gr56_","gr53_","gr58_","gr53_","gr53_","gr50_","gr51_","gr51_","gr66_","gr49_","gr63_","gr52_","gr68_","gr51_","gr56_","gr51_","gr54_","gr51_","gr49_","gr53_","gr54_","gr54_","gr50_","gr50_","gr54_","gr50_","gr72_","gr55_","gr52_","gr52_","gr66_","gr55_","gr50_","gr56_","gr61_","gr53_","gr54_","gr53_","gr50_","gr51_","gr51_","gr54_","gr51_","gr55_","gr71_","gr50_","gr49_","gr57_","gr67_","gr53_","gr49_","gr54_","gr54_"],
|
||||||
|
["gr53_","gr50_","gr72_","gr50_","gr54_","gr56_","gr52_","gr53_","gr54_","gr68_","gr50_","gr49_","gr50_","gr50_","gr56_","gr69_","gr71_","gr26-","rc17_","rc18_","gr25_","gr64_","gr53_","gr54_","gr49_","gr60_","gr58_","gr53_","gr55_","gr50_","gr51_","gr51_","gr51_","gr58_","gr58_","gr51_","gr49_","gr66_","gr51_","gr51_","gr72_","gr55_","gr72_","gr53_","gr51_","gr64_","gr55_","gr56_","gr57_","gr51_","gr63_","gr61_","gr53_","gr54_","gr54_","gr51_","gr54_","gr55_","gr70_","gr52_","gr56_","gr52_","gr67_","gr53_","gr49_","gr52_","gr55_","gr49_","gr52_","gr52_","gr54_","gr54_","gr50_","gr60_","gr50_","gr55_","gr52_","gr55_","gr56_","gr57_","gr50_","gr54_","gr49_","gr70_","gr55_","gr69_","gr51_","gr53_","gr59_","gr68_","gr53_","gr56_","gr64_","gr56_","gr54_","gr52_","gr53_","gr56_","gr55_","gr53_","gr54_","gr56_","gr52_","gr55_","gr50_","gr49_","gr55_","gr54_","gr52_","gr55_","gr53_","gr55_","gr50_","gr50_","gr55_","gr52_","gr57_","gr54_","gr50_","gr53_","gr71_","gr51_","gr56_","gr49_","gr55_","gr53_","gr53_","gr65_","gr57_","gr52_","gr50_","gr54_","gr55_","gr54_","gr53_","gr53_","gr50_","gr72_","gr55_","gr50_","gr51_","gr49_","gr53_","gr50_"],
|
||||||
|
["gr50_","gr55_","gr56_","gr56_","gr50_","gr56_","gr69_","gr49_","gr50_","gr50_","gr54_","gr56_","gr54_","gr51_","gr54_","gr51_","gr52_","gr27-","rc16_","rc18_","gr27_","gr52_","gr66_","gr56_","gr49_","gr56_","gr51_","gr59_","gr49_","gr52_","gr49_","gr51_","gr56_","gr54_","gr52_","gr49_","gr50_","gr51_","gr51_","gr51_","gr53_","gr51_","gr71_","gr52_","gr52_","gr50_","gr51_","gr50_","gr54_","gr49_","gr51_","gr55_","gr64_","gr52_","gr50_","gr49_","gr55_","gr58_","gr50_","gr50_","gr55_","gr56_","gr55_","gr49_","gr54_","gr53_","gr52_","gr54_","gr49_","gr55_","gr53_","gr58_","gr54_","gr69_","gr51_","gr53_","gr49_","gr51_","gr52_","gr54_","gr56_","gr50_","gr56_","gr55_","gr55_","gr53_","gr53_","gr55_","gr52_","gr53_","gr60_","gr54_","gr51_","gr53_","gr57_","gr52_","gr52_","gr54_","gr55_","gr50_","gr56_","gr69_","gr50_","gr54_","gr64_","gr64_","gr51_","gr68_","gr53_","gr61_","gr55_","gr56_","gr49_","gr67_","gr56_","gr53_","gr53_","gr55_","gr67_","gr66_","gr49_","gr56_","gr65_","gr55_","gr63_","gr52_","gr54_","gr52_","gr64_","gr49_","gr53_","gr50_","gr62_","gr68_","gr66_","gr56_","gr56_","gr53_","gr54_","gr56_","gr65_","gr56_","gr54_","gr55_"],
|
||||||
|
["gr49_","gr54_","gr52_","gr72_","gr50_","gr51_","gr53_","gr58_","gr53_","gr54_","gr65_","gr53_","gr51_","gr51_","gr55_","gr49_","gr52_","gr24-","rc16_","rc19_","gr25_","gr52_","gr53_","gr55_","gr55_","gr51_","gr52_","gr49_","gr68_","gr53_","gr56_","gr51_","gr56_","gr50_","gr51_","gr65_","gr55_","gr55_","gr50_","gr55_","gr56_","gr52_","gr53_","gr49_","gr53_","gr52_","gr50_","gr60_","gr55_","gr49_","gr67_","gr51_","gr55_","gr61_","gr51_","gr51_","gr54_","gr50_","gr53_","gr55_","gr70_","gr50_","gr53_","gr52_","gr55_","gr56_","gr53_","gr54_","gr51_","gr53_","gr50_","gr50_","gr50_","gr52_","gr52_","gr50_","gr63_","gr55_","gr49_","gr60_","gr49_","gr71_","gr50_","gr51_","gr51_","gr56_","gr53_","gr52_","gr52_","gr50_","gr50_","gr50_","gr56_","gr49_","gr70_","gr51_","gr53_","gr54_","gr51_","gr49_","gr62_","gr53_","gr53_","gr50_","gr52_","gr53_","gr70_","gr64_","gr56_","gr50_","gr51_","gr49_","gr50_","gr62_","gr53_","gr56_","gr54_","gr60_","gr50_","gr51_","gr49_","gr52_","gr66_","gr51_","gr56_","gr50_","gr50_","gr55_","gr58_","gr54_","gr51_","gr49_","gr49_","gr53_","gr52_","gr55_","gr53_","gr55_","gr52_","gr51_","gr56_","gr55_","gr57_","gr52_"],
|
||||||
|
["gr51_","gr54_","gr52_","gr51_","gr64_","gr49_","gr66_","gr55_","gr54_","gr54_","gr53_","gr57_","gr56_","gr51_","gr49_","gr56_","gr62_","gr24-","rc16_","rc18_","gr26_","gr55_","gr53_","gr58_","gr53_","gr50_","gr52_","gr52_","gr56_","gr53_","gr65_","gr52_","gr51_","gr56_","gr69_","gr51_","gr49_","gr63_","gr54_","gr56_","gr50_","gr50_","gr51_","gr52_","gr56_","gr54_","gr51_","gr55_","gr50_","gr50_","gr54_","gr57_","gr68_","gr66_","gr50_","gr49_","gr60_","gr55_","gr56_","gr50_","gr55_","gr61_","gr53_","gr49_","gr50_","gr51_","gr66_","gr56_","gr50_","gr63_","gr60_","gr54_","gr53_","gr56_","gr53_","gr53_","gr54_","gr58_","gr56_","gr66_","gr53_","gr53_","gr49_","gr49_","gr68_","gr62_","gr51_","gr54_","gr51_","gr61_","gr56_","gr53_","gr53_","gr53_","gr52_","gr51_","gr49_","gr71_","gr50_","gr51_","gr50_","gr56_","gr70_","gr50_","gr55_","gr54_","gr49_","gr50_","gr52_","gr55_","gr49_","gr51_","gr55_","gr50_","gr54_","gr62_","gr51_","gr52_","gr54_","gr72_","gr49_","gr52_","gr50_","gr53_","gr50_","gr55_","gr55_","gr67_","gr55_","gr53_","gr53_","gr50_","gr49_","gr58_","gr51_","gr50_","gr49_","gr54_","gr50_","gr69_","gr49_","gr61_","gr53_","gr65_"],
|
||||||
|
["gr56_","gr56_","gr55_","gr64_","gr50_","gr66_","gr53_","gr56_","gr54_","gr52_","gr56_","gr51_","gr55_","gr50_","gr52_","gr55_","gr51_","gr24-","rc16_","rc18_","gr27_","gr53_","gr52_","gr49_","gr49_","gr55_","gr53_","gr54_","gr53_","gr53_","gr52_","gr53_","gr49_","gr55_","gr52_","gr56_","gr64_","gr50_","gr55_","gr53_","gr50_","gr54_","gr49_","gr70_","gr67_","gr54_","gr53_","gr49_","gr56_","gr52_","gr70_","gr49_","gr53_","gr50_","gr72_","gr52_","gr49_","gr49_","gr52_","gr51_","gr56_","gr54_","gr55_","gr53_","gr49_","gr56_","gr67_","gr52_","gr53_","gr52_","gr53_","gr55_","gr70_","gr49_","gr53_","gr62_","gr54_","gr52_","gr57_","gr49_","gr59_","gr53_","gr51_","gr49_","gr50_","gr56_","gr54_","gr52_","gr57_","gr53_","gr69_","gr54_","gr51_","gr64_","gr53_","gr51_","gr56_","gr50_","gr54_","gr54_","gr58_","gr54_","gr53_","gr54_","gr49_","gr53_","gr53_","gr51_","gr56_","gr51_","gr49_","gr53_","gr54_","gr55_","gr51_","gr53_","gr54_","gr55_","gr57_","gr50_","gr55_","gr66_","gr51_","gr54_","gr53_","gr52_","gr54_","gr54_","gr70_","gr53_","gr52_","gr54_","gr54_","gr50_","gr49_","gr58_","gr51_","gr50_","gr71_","gr54_","gr50_","gr51_","gr59_","gr55_"],
|
||||||
|
["gr72_","gr51_","gr55_","gr55_","gr49_","gr55_","gr54_","gr53_","gr53_","gr56_","gr51_","gr51_","gr54_","gr56_","gr50_","gr55_","gr52_","gr27-","rc16_","rc19_","gr27_","gr55_","gr64_","gr52_","gr61_","gr49_","gr53_","gr70_","gr50_","gr52_","gr49_","gr54_","gr49_","gr56_","gr54_","gr55_","gr52_","gr49_","gr55_","gr70_","gr50_","gr55_","gr54_","gr54_","gr54_","gr54_","gr58_","gr52_","gr56_","gr55_","gr49_","gr52_","gr51_","gr53_","gr50_","gr51_","gr53_","gr49_","gr55_","gr51_","gr58_","gr55_","gr51_","gr50_","gr50_","gr54_","gr56_","gr59_","gr54_","gr52_","gr51_","gr51_","gr54_","gr64_","gr53_","gr53_","gr70_","gr53_","gr52_","gr55_","gr53_","gr54_","gr49_","gr51_","gr52_","gr53_","gr56_","gr55_","gr53_","gr50_","gr51_","gr53_","gr58_","gr51_","gr55_","gr52_","gr49_","gr54_","gr53_","gr53_","gr55_","gr56_","gr50_","gr54_","gr58_","gr49_","gr55_","gr50_","gr53_","gr54_","gr66_","gr55_","gr56_","gr54_","gr52_","gr63_","gr53_","gr69_","gr49_","gr49_","gr52_","gr53_","gr51_","gr61_","gr56_","gr56_","gr71_","gr51_","gr56_","gr54_","gr53_","gr52_","gr55_","gr61_","gr52_","gr54_","gr53_","gr68_","gr53_","gr53_","gr51_","gr56_","gr52_","gr53_"],
|
||||||
|
["gr50_","gr32_","gr28|","gr28|","gr28|","gr29|","gr28|","gr30|","gr31|","gr29|","gr31|","gr28|","gr31|","gr29|","gr30|","gr29|","gr30|","gr21+","rc16_","rc19_","gr21|","gr28|","gr31|","gr31|","gr31|","gr29|","gr28|","gr29|","gr29|","gr30|","gr30|","gr29|","gr31|","gr29|","gr30|","gr31|","gr29|","gr28|","gr28|","gr29|","gr28|","gr28|","gr30|","gr29|","gr30|","gr31|","gr31|","gr34-","gr52_","gr52_","gr72_","gr49_","gr54_","gr52_","gr51_","gr54_","gr56_","gr62_","gr57_","gr49_","gr53_","gr55_","gr56_","gr55_","gr53_","gr54_","gr56_","gr52_","gr67_","gr55_","gr55_","gr52_","gr61_","gr51_","gr69_","gr51_","gr55_","gr54_","gr49_","gr54_","gr57_","gr72_","gr51_","gr56_","gr52_","gr53_","gr63_","gr54_","gr56_","gr53_","gr56_","gr51_","gr49_","gr52_","gr51_","gr53_","gr62_","gr51_","gr56_","gr53_","gr49_","gr69_","gr53_","gr51_","gr49_","gr51_","gr50_","gr64_","gr51_","gr56_","gr54_","gr66_","gr53_","gr54_","gr72_","gr52_","gr65_","gr55_","gr55_","gr51_","gr56_","gr61_","gr67_","gr50_","gr53_","gr51_","gr49_","gr55_","gr53_","gr49_","gr51_","gr52_","gr62_","gr52_","gr54_","gr71_","gr61_","gr51_","gr50_","gr50_","gr54_","gr60_","gr54_","gr51_"],
|
||||||
|
["gr72_","gr27-","rc9_","rc21_","rc21_","rc21_","rc20_","rc21_","rc20_","rc21_","rc20_","rc21_","rc21_","rc21_","rc21_","rc21_","rc21_","rc21_","rc31_","rc29_","rc21_","rc21_","rc20_","rc20_","rc21_","rc20_","rc21_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc21_","rc21_","rc20_","rc21_","rc20_","rc11_","gr24_","gr50_","gr50_","gr51_","gr57_","gr69_","gr54_","gr50_","gr54_","gr49_","gr49_","gr60_","gr53_","gr57_","gr54_","gr55_","gr69_","gr52_","gr55_","gr52_","gr55_","gr61_","gr54_","gr49_","gr50_","gr51_","gr61_","gr53_","gr55_","gr58_","gr54_","gr55_","gr62_","gr56_","gr68_","gr72_","gr55_","gr56_","gr49_","gr52_","gr49_","gr51_","gr53_","gr70_","gr55_","gr50_","gr53_","gr49_","gr54_","gr53_","gr49_","gr55_","gr72_","gr63_","gr69_","gr53_","gr52_","gr56_","gr58_","gr53_","gr52_","gr50_","gr58_","gr59_","gr53_","gr68_","gr63_","gr56_","gr50_","gr50_","gr53_","gr51_","gr58_","gr51_","gr51_","gr51_","gr54_","gr58_","gr54_","gr70_","gr68_","gr53_","gr53_","gr53_","gr54_","gr49_","gr62_","gr53_","gr51_","gr52_","gr56_","gr55_","gr61_","gr49_","gr55_","gr49_","gr50_"],
|
||||||
|
["gr56_","gr24-","rc13_","rc23_","rc23_","rc22_","rc23_","rc23_","rc22_","rc23_","rc23_","rc23_","rc23_","rc22_","rc22_","rc23_","rc22_","rc23_","rc23_","rc23_","rc23_","rc23_","rc23_","rc23_","rc22_","rc23_","rc23_","rc22_","rc22_","rc23_","rc22_","rc23_","rc22_","rc23_","rc23_","rc22_","rc22_","rc22_","rc23_","rc22_","rc23_","rc22_","rc22_","rc23_","rc22_","rc23_","rc15_","gr26_","gr67_","gr49_","gr50_","gr50_","gr50_","gr51_","gr70_","gr50_","gr50_","gr56_","gr54_","gr56_","gr54_","gr69_","gr56_","gr51_","gr53_","gr49_","gr52_","gr53_","gr60_","gr56_","gr56_","gr52_","gr56_","gr51_","gr61_","gr50_","gr53_","gr54_","gr56_","gr53_","gr65_","gr49_","gr49_","gr56_","gr49_","gr55_","gr55_","gr49_","gr68_","gr50_","gr51_","gr49_","gr67_","gr53_","gr72_","gr55_","gr55_","gr49_","gr49_","gr53_","gr51_","gr65_","gr51_","gr65_","gr61_","gr54_","gr55_","gr54_","gr65_","gr51_","gr50_","gr64_","gr55_","gr50_","gr68_","gr51_","gr56_","gr53_","gr52_","gr53_","gr53_","gr54_","gr66_","gr56_","gr55_","gr55_","gr52_","gr49_","gr56_","gr51_","gr50_","gr51_","gr49_","gr51_","gr66_","gr52_","gr50_","gr50_","gr52_","gr55_","gr53_","gr50_","gr55_","gr49_"],
|
||||||
|
["gr51_","gr32|","gr31_","gr30_","gr29_","gr30_","gr31_","gr29_","gr31_","gr29_","gr30_","gr28_","gr28_","gr31_","gr28_","gr29_","gr28_","gr29_","gr31_","gr29_","gr30_","gr28_","gr30_","gr29_","gr30_","gr29_","gr28_","gr30_","gr28_","gr29_","gr30_","gr28_","gr28_","gr31_","gr29_","gr31_","gr28_","gr31_","gr29_","gr28_","gr31_","gr31_","gr31_","gr30_","gr31_","gr29_","gr29_","gr32+","gr55_","gr50_","gr52_","gr54_","gr51_","gr60_","gr56_","gr50_","gr49_","gr53_","gr56_","gr49_","gr51_","gr51_","gr59_","gr49_","gr50_","gr52_","gr72_","gr52_","gr55_","gr53_","gr62_","gr66_","gr51_","gr55_","gr53_","gr67_","gr56_","gr53_","gr50_","gr61_","gr54_","gr55_","gr55_","gr52_","gr55_","gr50_","gr72_","gr53_","gr51_","gr53_","gr55_","gr50_","gr53_","gr53_","gr50_","gr49_","gr68_","gr50_","gr64_","gr53_","gr51_","gr56_","gr55_","gr51_","gr49_","gr55_","gr49_","gr70_","gr50_","gr68_","gr58_","gr52_","gr52_","gr62_","gr52_","gr55_","gr50_","gr49_","gr52_","gr69_","gr53_","gr54_","gr50_","gr56_","gr54_","gr49_","gr52_","gr54_","gr53_","gr49_","gr51_","gr50_","gr54_","gr52_","gr52_","gr50_","gr54_","gr65_","gr49_","gr55_","gr66_","gr60_","gr54_","gr72_"],
|
||||||
|
["gr49_","gr53_","gr53_","gr55_","gr69_","gr49_","gr50_","gr50_","gr54_","gr56_","gr55_","gr51_","gr54_","gr53_","gr49_","gr57_","gr54_","gr50_","gr65_","gr53_","gr72_","gr49_","gr53_","gr53_","gr51_","gr52_","gr52_","gr53_","gr50_","gr53_","gr53_","gr49_","gr53_","gr54_","gr65_","gr52_","gr63_","gr59_","gr52_","gr52_","gr70_","gr51_","gr72_","gr52_","gr35_","gr28|","gr31|","gr32-","gr54_","gr52_","gr59_","gr53_","gr49_","gr63_","gr56_","gr55_","gr55_","gr56_","gr51_","gr56_","gr50_","gr56_","gr63_","gr55_","gr49_","gr49_","gr56_","gr63_","gr56_","gr70_","gr49_","gr52_","gr53_","gr56_","gr68_","gr50_","gr53_","gr51_","gr54_","gr54_","gr53_","gr54_","gr64_","gr50_","gr50_","gr55_","gr55_","gr53_","gr50_","gr53_","gr52_","gr49_","gr56_","gr52_","gr53_","gr51_","gr52_","gr68_","gr50_","gr62_","gr56_","gr50_","gr49_","gr49_","gr52_","gr62_","gr51_","gr53_","gr51_","gr51_","gr53_","gr56_","gr52_","gr51_","gr56_","gr60_","gr66_","gr56_","gr57_","gr56_","gr52_","gr51_","gr49_","gr54_","gr54_","gr57_","gr54_","gr52_","gr62_","gr49_","gr56_","gr52_","gr55_","gr72_","gr53_","gr51_","gr50_","gr53_","gr54_","gr53_","gr72_","gr53_","gr55_","gr55_"],
|
||||||
|
["gr50_","gr72_","gr51_","gr60_","gr49_","gr50_","gr54_","gr49_","gr62_","gr51_","gr49_","gr57_","gr51_","gr56_","gr50_","gr50_","gr55_","gr55_","gr49_","gr54_","gr54_","gr63_","gr52_","gr51_","gr55_","gr54_","gr51_","gr51_","gr53_","gr56_","gr61_","gr52_","gr55_","gr55_","gr50_","gr49_","gr63_","gr54_","gr54_","gr55_","gr54_","gr68_","gr52_","gr65_","gr25-","rc8_","rc10_","gr27_","gr56_","gr55_","gr53_","gr53_","gr52_","gr55_","gr54_","gr63_","gr52_","gr55_","gr52_","gr54_","gr49_","gr53_","gr54_","gr54_","gr51_","gr55_","gr51_","gr59_","gr53_","gr50_","gr66_","gr51_","gr54_","gr55_","gr51_","gr63_","gr50_","gr56_","gr51_","gr54_","gr56_","gr55_","gr52_","gr50_","gr57_","gr56_","gr51_","gr49_","gr55_","gr50_","gr49_","gr54_","gr60_","gr50_","gr50_","gr53_","gr54_","gr56_","gr56_","gr51_","gr50_","gr56_","gr65_","gr51_","gr70_","gr50_","gr53_","gr50_","gr53_","gr50_","gr65_","gr52_","gr55_","gr49_","gr63_","gr52_","gr54_","gr58_","gr52_","gr49_","gr50_","gr70_","gr56_","gr51_","gr70_","gr49_","gr49_","gr58_","gr49_","gr59_","gr49_","gr55_","gr54_","gr55_","gr67_","gr49_","gr60_","gr55_","gr50_","gr50_","gr63_","gr54_","gr66_","gr55_"],
|
||||||
|
["gr53_","gr52_","gr53_","gr52_","gr66_","gr54_","gr64_","gr61_","gr52_","gr60_","gr51_","gr54_","gr56_","gr57_","gr52_","gr52_","gr59_","gr54_","gr52_","gr49_","gr65_","gr56_","gr49_","gr52_","gr58_","gr53_","gr50_","gr71_","gr56_","gr51_","gr55_","gr72_","gr51_","gr57_","gr54_","gr56_","gr53_","gr51_","gr55_","gr55_","gr62_","gr50_","gr49_","gr54_","gr26-","rc16_","rc18_","gr26_","gr68_","gr51_","gr51_","gr72_","gr52_","gr65_","gr49_","gr53_","gr55_","gr52_","gr70_","gr49_","gr49_","gr49_","gr54_","gr53_","gr55_","gr62_","gr51_","gr50_","gr55_","gr57_","gr49_","gr54_","gr54_","gr50_","gr58_","gr51_","gr56_","gr53_","gr51_","gr55_","gr69_","gr50_","gr69_","gr53_","gr54_","gr52_","gr61_","gr58_","gr51_","gr53_","gr53_","gr49_","gr56_","gr56_","gr49_","gr56_","gr52_","gr53_","gr50_","gr57_","gr49_","gr49_","gr63_","gr66_","gr54_","gr68_","gr55_","gr53_","gr56_","gr49_","gr55_","gr49_","gr52_","gr49_","gr50_","gr70_","gr55_","gr56_","gr53_","gr61_","gr55_","gr55_","gr55_","gr62_","gr55_","gr56_","gr55_","gr56_","gr55_","gr53_","gr61_","gr53_","gr49_","gr50_","gr55_","gr51_","gr53_","gr54_","gr54_","gr69_","gr54_","gr70_","gr55_","gr55_"],
|
||||||
|
["gr51_","gr66_","gr51_","gr53_","gr71_","gr54_","gr55_","gr53_","gr50_","gr58_","gr52_","gr64_","gr53_","gr50_","gr56_","gr54_","gr49_","gr55_","gr51_","gr71_","gr49_","gr52_","gr67_","gr50_","gr52_","gr50_","gr49_","gr50_","gr52_","gr52_","gr50_","gr51_","gr49_","gr52_","gr55_","gr58_","gr55_","gr52_","gr53_","gr50_","gr52_","gr54_","gr53_","gr56_","gr24-","rc17_","rc19_","gr27_","gr51_","gr49_","gr53_","gr54_","gr49_","gr55_","gr51_","gr62_","gr49_","gr55_","gr63_","gr52_","gr49_","gr60_","gr56_","gr53_","gr63_","gr55_","gr54_","gr51_","gr54_","gr52_","gr54_","gr69_","gr53_","gr67_","gr49_","gr53_","gr55_","gr49_","gr52_","gr64_","gr52_","gr53_","gr50_","gr58_","gr55_","gr60_","gr53_","gr55_","gr54_","gr53_","gr57_","gr51_","gr54_","gr61_","gr49_","gr59_","gr52_","gr59_","gr56_","gr50_","gr68_","gr53_","gr58_","gr53_","gr53_","gr50_","gr56_","gr55_","gr67_","gr54_","gr55_","gr53_","gr53_","gr50_","gr49_","gr51_","gr53_","gr49_","gr51_","gr54_","gr50_","gr68_","gr54_","gr56_","gr65_","gr55_","gr54_","gr63_","gr56_","gr49_","gr54_","gr70_","gr49_","gr64_","gr49_","gr50_","gr53_","gr50_","gr50_","gr54_","gr63_","gr53_","gr54_","gr56_"],
|
||||||
|
["gr52_","gr56_","gr69_","gr50_","gr50_","gr56_","gr68_","gr49_","gr54_","gr69_","gr54_","gr49_","gr52_","gr58_","gr54_","gr56_","gr51_","gr56_","gr54_","gr55_","gr62_","gr51_","gr52_","gr52_","gr52_","gr68_","gr56_","gr50_","gr49_","gr69_","gr55_","gr55_","gr51_","gr56_","gr51_","gr53_","gr54_","gr49_","gr49_","gr50_","gr49_","gr55_","gr49_","gr49_","gr25-","rc17_","rc18_","gr24_","gr53_","gr56_","gr50_","gr61_","gr50_","gr56_","gr50_","gr52_","gr51_","gr54_","gr57_","gr52_","gr51_","gr54_","gr52_","gr52_","gr49_","gr49_","gr61_","gr62_","gr58_","gr50_","gr64_","gr49_","gr58_","gr50_","gr55_","gr53_","gr55_","gr52_","gr56_","gr50_","gr55_","gr50_","gr50_","gr49_","gr69_","gr54_","gr51_","gr65_","gr56_","gr50_","gr53_","gr51_","gr52_","gr49_","gr52_","gr54_","gr55_","gr51_","gr50_","gr61_","gr52_","gr53_","gr51_","gr52_","gr52_","gr54_","gr49_","gr55_","gr72_","gr59_","gr49_","gr50_","gr56_","gr69_","gr52_","gr58_","gr55_","gr54_","gr56_","gr59_","gr53_","gr63_","gr52_","gr55_","gr68_","gr52_","gr55_","gr54_","gr51_","gr54_","gr50_","gr56_","gr54_","gr49_","gr57_","gr53_","gr52_","gr52_","gr54_","gr61_","gr56_","gr52_","gr54_","gr49_"],
|
||||||
|
["gr56_","gr49_","gr50_","gr72_","gr49_","gr70_","gr55_","gr50_","gr49_","gr53_","gr55_","gr49_","gr59_","gr49_","gr70_","gr50_","gr71_","gr51_","gr53_","gr57_","gr56_","gr54_","gr58_","gr51_","gr52_","gr59_","gr54_","gr66_","gr55_","gr69_","gr62_","gr52_","gr56_","gr62_","gr51_","gr59_","gr50_","gr56_","gr50_","gr71_","gr52_","gr53_","gr53_","gr56_","gr26-","rc17_","rc19_","gr27_","gr50_","gr49_","gr68_","gr55_","gr64_","gr53_","gr55_","gr62_","gr51_","gr67_","gr50_","gr51_","gr69_","gr56_","gr58_","gr52_","gr54_","gr60_","gr55_","gr68_","gr50_","gr67_","gr56_","gr49_","gr55_","gr54_","gr54_","gr52_","gr56_","gr55_","gr53_","gr68_","gr53_","gr56_","gr54_","gr50_","gr56_","gr52_","gr55_","gr54_","gr49_","gr60_","gr49_","gr50_","gr51_","gr68_","gr56_","gr58_","gr52_","gr52_","gr55_","gr50_","gr49_","gr56_","gr50_","gr72_","gr49_","gr64_","gr50_","gr69_","gr53_","gr56_","gr69_","gr56_","gr54_","gr56_","gr51_","gr51_","gr55_","gr53_","gr50_","gr52_","gr62_","gr55_","gr67_","gr53_","gr55_","gr50_","gr50_","gr53_","gr50_","gr53_","gr50_","gr69_","gr56_","gr53_","gr55_","gr52_","gr50_","gr59_","gr50_","gr51_","gr50_","gr66_","gr56_","gr58_"],
|
||||||
|
["gr55_","gr66_","gr51_","gr49_","gr53_","gr56_","gr56_","gr71_","gr51_","gr51_","gr56_","gr55_","gr51_","gr56_","gr55_","gr61_","gr54_","gr55_","gr56_","gr54_","gr62_","gr52_","gr55_","gr62_","gr50_","gr71_","gr53_","gr55_","gr69_","gr53_","gr63_","gr56_","gr55_","gr53_","gr55_","gr52_","gr51_","gr67_","gr50_","gr55_","gr55_","gr64_","gr56_","gr53_","gr25-","rc17_","rc19_","gr25_","gr50_","gr51_","gr49_","gr51_","gr51_","gr52_","gr50_","gr52_","gr49_","gr53_","gr51_","gr56_","gr56_","gr49_","gr49_","gr69_","gr54_","gr49_","gr54_","gr52_","gr55_","gr56_","gr55_","gr53_","gr58_","gr55_","gr52_","gr49_","gr49_","gr49_","gr51_","gr54_","gr53_","gr71_","gr54_","gr62_","gr71_","gr54_","gr56_","gr56_","gr64_","gr52_","gr52_","gr54_","gr50_","gr55_","gr54_","gr54_","gr53_","gr54_","gr72_","gr50_","gr51_","gr54_","gr63_","gr55_","gr52_","gr54_","gr51_","gr49_","gr59_","gr51_","gr50_","gr54_","gr55_","gr53_","gr62_","gr54_","gr51_","gr72_","gr50_","gr50_","gr54_","gr53_","gr49_","gr50_","gr60_","gr54_","gr55_","gr53_","gr51_","gr69_","gr54_","gr53_","gr71_","gr53_","gr50_","gr55_","gr54_","gr55_","gr61_","gr56_","gr52_","gr55_","gr68_","gr51_"],
|
||||||
|
["gr56_","gr53_","gr49_","gr52_","gr54_","gr52_","gr71_","gr56_","gr67_","gr54_","gr49_","gr51_","gr52_","gr54_","gr51_","gr57_","gr56_","gr53_","gr54_","gr69_","gr49_","gr54_","gr49_","gr53_","gr71_","gr49_","gr51_","gr51_","gr53_","gr68_","gr50_","gr54_","gr49_","gr61_","gr55_","gr55_","gr56_","gr49_","gr55_","gr68_","gr56_","gr49_","gr52_","gr49_","gr26-","rc17_","rc19_","gr25_","gr60_","gr54_","gr66_","gr50_","gr59_","gr55_","gr50_","gr63_","gr55_","gr69_","gr51_","gr52_","gr52_","gr50_","gr50_","gr53_","gr57_","gr55_","gr56_","gr54_","gr49_","gr56_","gr51_","gr61_","gr52_","gr53_","gr50_","gr52_","gr60_","gr50_","gr52_","gr72_","gr56_","gr56_","gr65_","gr52_","gr52_","gr50_","gr56_","gr71_","gr54_","gr57_","gr55_","gr49_","gr51_","gr49_","gr54_","gr50_","gr56_","gr66_","gr53_","gr60_","gr50_","gr63_","gr49_","gr52_","gr71_","gr66_","gr52_","gr52_","gr50_","gr54_","gr49_","gr68_","gr59_","gr52_","gr52_","gr60_","gr52_","gr55_","gr56_","gr52_","gr69_","gr55_","gr71_","gr53_","gr49_","gr58_","gr53_","gr53_","gr55_","gr62_","gr53_","gr62_","gr50_","gr56_","gr59_","gr55_","gr65_","gr49_","gr65_","gr50_","gr56_","gr51_","gr50_","gr53_"],
|
||||||
|
["gr53_","gr49_","gr49_","gr57_","gr52_","gr52_","gr51_","gr54_","gr51_","gr70_","gr49_","gr53_","gr70_","gr52_","gr56_","gr52_","gr69_","gr59_","gr49_","gr54_","gr49_","gr50_","gr56_","gr56_","gr51_","gr49_","gr49_","gr53_","gr69_","gr50_","gr54_","gr51_","gr54_","gr55_","gr50_","gr52_","gr50_","gr51_","gr50_","gr53_","gr72_","gr55_","gr71_","gr50_","gr27-","rc17_","rc18_","gr25_","gr50_","gr50_","gr55_","gr51_","gr63_","gr54_","gr49_","gr54_","gr51_","gr50_","gr60_","gr53_","gr65_","gr50_","gr70_","gr54_","gr55_","gr54_","gr55_","gr51_","gr56_","gr51_","gr52_","gr58_","gr53_","gr49_","gr56_","gr69_","gr55_","gr67_","gr54_","gr67_","gr54_","gr50_","gr49_","gr53_","gr53_","gr50_","gr53_","gr49_","gr51_","gr52_","gr51_","gr51_","gr52_","gr59_","gr56_","gr55_","gr63_","gr55_","gr54_","gr56_","gr54_","gr52_","gr58_","gr52_","gr56_","gr51_","gr52_","gr61_","gr50_","gr72_","gr51_","gr50_","gr49_","gr51_","gr70_","gr52_","gr50_","gr56_","gr52_","gr50_","gr51_","gr55_","gr52_","gr54_","gr55_","gr53_","gr54_","gr53_","gr70_","gr56_","gr49_","gr50_","gr50_","gr55_","gr50_","gr51_","gr51_","gr56_","gr60_","gr51_","gr52_","gr71_","gr50_","gr55_"],
|
||||||
|
["gr52_","gr62_","gr54_","gr49_","gr54_","gr55_","gr54_","gr56_","gr49_","gr52_","gr50_","gr61_","gr65_","gr56_","gr55_","gr56_","gr52_","gr52_","gr71_","gr49_","gr54_","gr51_","gr54_","gr64_","gr69_","gr53_","gr54_","gr53_","gr54_","gr55_","gr53_","gr56_","gr54_","gr50_","gr50_","gr51_","gr49_","gr56_","gr51_","gr51_","gr55_","gr50_","gr50_","gr51_","gr24-","rc17_","rc19_","gr24_","gr50_","gr72_","gr56_","gr54_","gr49_","gr56_","gr61_","gr49_","gr63_","gr60_","gr52_","gr53_","gr54_","gr49_","gr50_","gr63_","gr55_","gr55_","gr49_","gr50_","gr52_","gr57_","gr52_","gr51_","gr52_","gr50_","gr54_","gr53_","gr51_","gr59_","gr51_","gr54_","gr54_","gr54_","gr68_","gr56_","gr51_","gr54_","gr55_","gr56_","gr55_","gr52_","gr54_","gr50_","gr54_","gr51_","gr60_","gr52_","gr56_","gr53_","gr51_","gr55_","gr70_","gr52_","gr56_","gr49_","gr72_","gr50_","gr52_","gr53_","gr58_","gr50_","gr69_","gr49_","gr51_","gr68_","gr52_","gr55_","gr53_","gr53_","gr69_","gr53_","gr55_","gr53_","gr50_","gr53_","gr70_","gr63_","gr56_","gr69_","gr55_","gr52_","gr56_","gr56_","gr55_","gr49_","gr55_","gr52_","gr52_","gr52_","gr55_","gr50_","gr65_","gr50_","gr59_","gr49_"],
|
||||||
|
["gr70_","gr52_","gr63_","gr51_","gr69_","gr54_","gr54_","gr54_","gr54_","gr55_","gr50_","gr52_","gr52_","gr52_","gr56_","gr52_","gr54_","gr61_","gr56_","gr55_","gr55_","gr62_","gr50_","gr52_","gr55_","gr55_","gr52_","gr52_","gr55_","gr52_","gr53_","gr54_","gr49_","gr54_","gr53_","gr53_","gr53_","gr64_","gr50_","gr53_","gr53_","gr51_","gr53_","gr49_","gr26-","rc16_","rc18_","gr24_","gr53_","gr55_","gr68_","gr51_","gr55_","gr61_","gr55_","gr57_","gr65_","gr51_","gr52_","gr52_","gr53_","gr55_","gr49_","gr49_","gr50_","gr72_","gr54_","gr67_","gr53_","gr51_","gr49_","gr49_","gr58_","gr56_","gr51_","gr51_","gr63_","gr50_","gr49_","gr49_","gr66_","gr50_","gr51_","gr53_","gr54_","gr68_","gr56_","gr52_","gr50_","gr49_","gr72_","gr56_","gr65_","gr51_","gr49_","gr65_","gr51_","gr52_","gr51_","gr55_","gr51_","gr56_","gr52_","gr50_","gr55_","gr54_","gr52_","gr67_","gr52_","gr51_","gr58_","gr64_","gr55_","gr55_","gr54_","gr51_","gr60_","gr54_","gr52_","gr52_","gr51_","gr64_","gr55_","gr50_","gr53_","gr65_","gr52_","gr54_","gr52_","gr49_","gr59_","gr49_","gr65_","gr62_","gr50_","gr56_","gr52_","gr69_","gr49_","gr63_","gr55_","gr53_","gr55_","gr52_"],
|
||||||
|
["gr67_","gr52_","gr51_","gr55_","gr65_","gr56_","gr52_","gr49_","gr50_","gr56_","gr50_","gr50_","gr57_","gr55_","gr58_","gr49_","gr51_","gr72_","gr54_","gr71_","gr70_","gr53_","gr51_","gr52_","gr63_","gr54_","gr49_","gr65_","gr66_","gr56_","gr55_","gr53_","gr54_","gr51_","gr68_","gr49_","gr70_","gr68_","gr55_","gr51_","gr49_","gr49_","gr55_","gr54_","gr27-","rc16_","rc19_","gr26_","gr50_","gr63_","gr53_","gr51_","gr50_","gr53_","gr71_","gr53_","gr50_","gr56_","gr52_","gr56_","gr52_","gr53_","gr50_","gr59_","gr56_","gr52_","gr64_","gr55_","gr50_","gr56_","gr52_","gr51_","gr56_","gr51_","gr56_","gr56_","gr53_","gr49_","gr56_","gr53_","gr56_","gr56_","gr54_","gr52_","gr54_","gr54_","gr55_","gr51_","gr59_","gr51_","gr51_","gr53_","gr53_","gr51_","gr56_","gr54_","gr50_","gr53_","gr55_","gr51_","gr53_","gr71_","gr54_","gr63_","gr53_","gr55_","gr52_","gr55_","gr54_","gr51_","gr49_","gr55_","gr70_","gr50_","gr59_","gr50_","gr56_","gr65_","gr50_","gr55_","gr53_","gr56_","gr53_","gr54_","gr54_","gr50_","gr50_","gr63_","gr51_","gr64_","gr50_","gr52_","gr55_","gr54_","gr50_","gr50_","gr50_","gr52_","gr52_","gr51_","gr54_","gr55_","gr52_","gr55_"],
|
||||||
|
["gr50_","gr62_","gr59_","gr54_","gr50_","gr53_","gr56_","gr56_","gr53_","gr53_","gr50_","gr53_","gr54_","gr50_","gr55_","gr53_","gr51_","gr52_","gr56_","gr50_","gr49_","gr63_","gr50_","gr65_","gr54_","gr51_","gr54_","gr53_","gr53_","gr68_","gr50_","gr51_","gr70_","gr50_","gr71_","gr55_","gr52_","gr50_","gr49_","gr62_","gr53_","gr52_","gr50_","gr49_","gr27-","rc16_","rc19_","gr24_","gr51_","gr57_","gr49_","gr53_","gr50_","gr56_","gr53_","gr53_","gr49_","gr50_","gr52_","gr51_","gr52_","gr50_","gr52_","gr53_","gr49_","gr56_","gr53_","gr61_","gr52_","gr49_","gr54_","gr49_","gr52_","gr52_","gr53_","gr51_","gr67_","gr54_","gr58_","gr65_","gr49_","gr56_","gr53_","gr54_","gr50_","gr52_","gr51_","gr55_","gr52_","gr51_","gr53_","gr55_","gr50_","gr49_","gr49_","gr60_","gr52_","gr55_","gr55_","gr56_","gr52_","gr49_","gr53_","gr49_","gr50_","gr54_","gr52_","gr49_","gr57_","gr51_","gr49_","gr55_","gr55_","gr55_","gr53_","gr52_","gr65_","gr56_","gr52_","gr54_","gr54_","gr53_","gr50_","gr49_","gr55_","gr50_","gr49_","gr49_","gr53_","gr56_","gr53_","gr49_","gr67_","gr58_","gr56_","gr55_","gr55_","gr56_","gr54_","gr53_","gr53_","gr56_","gr51_","gr50_"],
|
||||||
|
["gr53_","gr56_","gr55_","gr63_","gr56_","gr54_","gr49_","gr51_","gr55_","gr56_","gr49_","gr55_","gr52_","gr68_","gr53_","gr50_","gr62_","gr57_","gr53_","gr55_","gr65_","gr52_","gr55_","gr50_","gr68_","gr52_","gr51_","gr54_","gr49_","gr54_","gr56_","gr50_","gr49_","gr50_","gr69_","gr55_","gr54_","gr53_","gr49_","gr52_","gr55_","gr53_","gr68_","gr51_","gr26-","rc16_","rc18_","gr26_","gr54_","gr52_","gr57_","gr50_","gr55_","gr55_","gr56_","gr50_","gr56_","gr49_","gr60_","gr53_","gr53_","gr70_","gr56_","gr56_","gr61_","gr54_","gr55_","gr53_","gr59_","gr53_","gr52_","gr67_","gr54_","gr50_","gr50_","gr60_","gr50_","gr52_","gr54_","gr53_","gr53_","gr56_","gr72_","gr50_","gr51_","gr52_","gr53_","gr56_","gr67_","gr56_","gr56_","gr64_","gr55_","gr55_","gr60_","gr50_","gr72_","gr51_","gr51_","gr64_","gr55_","gr54_","gr67_","gr55_","gr61_","gr58_","gr52_","gr50_","gr52_","gr57_","gr51_","gr63_","gr52_","gr69_","gr50_","gr55_","gr71_","gr50_","gr53_","gr50_","gr53_","gr56_","gr63_","gr49_","gr49_","gr50_","gr51_","gr50_","gr50_","gr65_","gr51_","gr64_","gr51_","gr49_","gr52_","gr57_","gr51_","gr66_","gr56_","gr54_","gr62_","gr56_","gr51_","gr61_"],
|
||||||
|
["gr58_","gr52_","gr55_","gr50_","gr51_","gr49_","gr49_","gr50_","gr55_","gr64_","gr49_","gr55_","gr50_","gr53_","gr53_","gr56_","gr52_","gr56_","gr54_","gr70_","gr54_","gr53_","gr49_","gr55_","gr49_","gr51_","gr56_","gr54_","gr70_","gr56_","gr55_","gr57_","gr55_","gr52_","gr56_","gr50_","gr53_","gr50_","gr55_","gr55_","gr56_","gr51_","gr54_","gr51_","gr26-","rc16_","rc18_","gr24_","gr52_","gr56_","gr60_","gr64_","gr56_","gr66_","gr50_","gr51_","gr53_","gr54_","gr51_","gr52_","gr54_","gr50_","gr54_","gr51_","gr51_","gr61_","gr52_","gr56_","gr55_","gr68_","gr49_","gr50_","gr56_","gr54_","gr55_","gr51_","gr50_","gr56_","gr59_","gr50_","gr60_","gr50_","gr54_","gr64_","gr49_","gr64_","gr61_","gr52_","gr49_","gr50_","gr50_","gr56_","gr54_","gr53_","gr56_","gr49_","gr55_","gr55_","gr51_","gr50_","gr56_","gr55_","gr54_","gr50_","gr55_","gr51_","gr59_","gr49_","gr49_","gr55_","gr55_","gr55_","gr59_","gr53_","gr59_","gr53_","gr50_","gr72_","gr52_","gr50_","gr60_","gr55_","gr51_","gr56_","gr52_","gr49_","gr54_","gr53_","gr50_","gr51_","gr61_","gr50_","gr56_","gr67_","gr54_","gr55_","gr54_","gr49_","gr50_","gr52_","gr55_","gr56_","gr54_","gr49_"],
|
||||||
|
["gr50_","gr49_","gr51_","gr64_","gr50_","gr49_","gr62_","gr54_","gr62_","gr54_","gr56_","gr54_","gr50_","gr62_","gr55_","gr53_","gr52_","gr64_","gr51_","gr55_","gr56_","gr56_","gr50_","gr57_","gr52_","gr64_","gr53_","gr53_","gr52_","gr66_","gr56_","gr49_","gr64_","gr55_","gr54_","gr56_","gr49_","gr51_","gr51_","gr55_","gr56_","gr54_","gr56_","gr49_","gr27-","rc16_","rc18_","gr27_","gr53_","gr62_","gr52_","gr49_","gr70_","gr55_","gr49_","gr56_","gr49_","gr56_","gr66_","gr50_","gr49_","gr53_","gr54_","gr54_","gr69_","gr53_","gr53_","gr52_","gr63_","gr54_","gr51_","gr53_","gr56_","gr63_","gr52_","gr49_","gr51_","gr52_","gr50_","gr71_","gr54_","gr53_","gr56_","gr49_","gr52_","gr55_","gr51_","gr53_","gr54_","gr50_","gr51_","gr53_","gr61_","gr49_","gr55_","gr56_","gr49_","gr53_","gr62_","gr55_","gr69_","gr51_","gr55_","gr64_","gr56_","gr49_","gr50_","gr55_","gr54_","gr53_","gr53_","gr56_","gr54_","gr54_","gr56_","gr54_","gr50_","gr49_","gr56_","gr71_","gr49_","gr53_","gr56_","gr53_","gr72_","gr55_","gr67_","gr71_","gr52_","gr71_","gr51_","gr54_","gr50_","gr49_","gr54_","gr49_","gr56_","gr53_","gr52_","gr57_","gr49_","gr55_","gr58_","gr54_"],
|
||||||
|
["gr53_","gr56_","gr50_","gr56_","gr54_","gr51_","gr49_","gr54_","gr52_","gr49_","gr55_","gr51_","gr50_","gr70_","gr50_","gr51_","gr55_","gr49_","gr52_","gr51_","gr54_","gr56_","gr56_","gr55_","gr54_","gr49_","gr57_","gr49_","gr51_","gr50_","gr59_","gr49_","gr51_","gr51_","gr56_","gr71_","gr58_","gr55_","gr53_","gr51_","gr62_","gr54_","gr50_","gr69_","gr27-","rc16_","rc18_","gr26_","gr49_","gr53_","gr55_","gr53_","gr49_","gr64_","gr54_","gr50_","gr68_","gr56_","gr49_","gr63_","gr52_","gr55_","gr56_","gr49_","gr65_","gr71_","gr49_","gr60_","gr53_","gr68_","gr52_","gr60_","gr56_","gr53_","gr56_","gr53_","gr52_","gr55_","gr67_","gr52_","gr58_","gr50_","gr54_","gr60_","gr52_","gr50_","gr54_","gr50_","gr49_","gr55_","gr53_","gr49_","gr53_","gr53_","gr71_","gr55_","gr54_","gr61_","gr54_","gr53_","gr63_","gr50_","gr54_","gr51_","gr56_","gr53_","gr49_","gr50_","gr53_","gr50_","gr52_","gr49_","gr51_","gr56_","gr56_","gr64_","gr70_","gr53_","gr66_","gr56_","gr53_","gr55_","gr52_","gr49_","gr52_","gr52_","gr50_","gr50_","gr50_","gr52_","gr53_","gr53_","gr65_","gr50_","gr52_","gr55_","gr56_","gr54_","gr54_","gr53_","gr52_","gr61_","gr56_","gr50_"],
|
||||||
|
["gr50_","gr56_","gr53_","gr58_","gr55_","gr65_","gr66_","gr51_","gr49_","gr49_","gr54_","gr70_","gr51_","gr53_","gr56_","gr50_","gr69_","gr52_","gr56_","gr49_","gr65_","gr50_","gr60_","gr49_","gr55_","gr49_","gr53_","gr52_","gr50_","gr50_","gr56_","gr49_","gr49_","gr56_","gr70_","gr49_","gr55_","gr54_","gr52_","gr51_","gr52_","gr52_","gr59_","gr56_","gr26-","rc16_","rc18_","gr27_","gr56_","gr53_","gr55_","gr66_","gr49_","gr52_","gr49_","gr56_","gr54_","gr52_","gr72_","gr49_","gr64_","gr49_","gr51_","gr53_","gr56_","gr50_","gr50_","gr53_","gr55_","gr53_","gr58_","gr56_","gr70_","gr56_","gr68_","gr55_","gr55_","gr49_","gr54_","gr50_","gr49_","gr56_","gr56_","gr49_","gr49_","gr56_","gr56_","gr52_","gr51_","gr49_","gr55_","gr67_","gr69_","gr56_","gr49_","gr62_","gr53_","gr54_","gr49_","gr71_","gr54_","gr69_","gr51_","gr51_","gr55_","gr54_","gr56_","gr52_","gr60_","gr54_","gr53_","gr50_","gr50_","gr60_","gr53_","gr53_","gr55_","gr52_","gr50_","gr61_","gr56_","gr71_","gr56_","gr51_","gr50_","gr57_","gr51_","gr53_","gr58_","gr50_","gr59_","gr53_","gr68_","gr54_","gr55_","gr58_","gr56_","gr53_","gr55_","gr54_","gr55_","gr51_","gr56_","gr63_"],
|
||||||
|
["gr51_","gr57_","gr53_","gr63_","gr53_","gr50_","gr64_","gr51_","gr69_","gr71_","gr53_","gr55_","gr53_","gr51_","gr55_","gr56_","gr54_","gr72_","gr49_","gr49_","gr49_","gr56_","gr54_","gr63_","gr55_","gr53_","gr49_","gr69_","gr51_","gr50_","gr71_","gr49_","gr50_","gr55_","gr56_","gr53_","gr58_","gr49_","gr49_","gr55_","gr64_","gr55_","gr53_","gr49_","gr26-","rc17_","rc19_","gr26_","gr57_","gr55_","gr49_","gr50_","gr54_","gr52_","gr49_","gr50_","gr54_","gr54_","gr71_","gr50_","gr53_","gr50_","gr56_","gr49_","gr49_","gr55_","gr62_","gr49_","gr70_","gr49_","gr54_","gr56_","gr51_","gr49_","gr56_","gr64_","gr50_","gr51_","gr66_","gr56_","gr51_","gr55_","gr54_","gr65_","gr50_","gr65_","gr55_","gr49_","gr53_","gr65_","gr56_","gr68_","gr55_","gr51_","gr53_","gr70_","gr55_","gr55_","gr56_","gr50_","gr50_","gr51_","gr53_","gr70_","gr53_","gr52_","gr54_","gr69_","gr51_","gr49_","gr49_","gr67_","gr53_","gr56_","gr53_","gr52_","gr53_","gr55_","gr56_","gr54_","gr50_","gr52_","gr52_","gr51_","gr56_","gr53_","gr53_","gr56_","gr53_","gr58_","gr53_","gr56_","gr52_","gr53_","gr56_","gr50_","gr54_","gr65_","gr56_","gr62_","gr52_","gr72_","gr50_","gr52_"],
|
||||||
|
["gr54_","gr51_","gr63_","gr53_","gr63_","gr54_","gr53_","gr56_","gr55_","gr49_","gr51_","gr55_","gr56_","gr49_","gr56_","gr71_","gr49_","gr53_","gr69_","gr52_","gr54_","gr49_","gr54_","gr50_","gr54_","gr54_","gr53_","gr53_","gr52_","gr56_","gr55_","gr50_","gr62_","gr55_","gr53_","gr52_","gr57_","gr55_","gr52_","gr56_","gr51_","gr56_","gr62_","gr56_","gr24-","rc16_","rc19_","gr25_","gr53_","gr50_","gr72_","gr53_","gr64_","gr55_","gr55_","gr56_","gr54_","gr53_","gr61_","gr49_","gr67_","gr50_","gr63_","gr69_","gr54_","gr52_","gr54_","gr55_","gr50_","gr65_","gr55_","gr68_","gr54_","gr55_","gr60_","gr55_","gr54_","gr52_","gr49_","gr54_","gr72_","gr55_","gr55_","gr51_","gr56_","gr69_","gr52_","gr51_","gr53_","gr54_","gr49_","gr51_","gr49_","gr61_","gr51_","gr70_","gr53_","gr67_","gr51_","gr56_","gr50_","gr52_","gr54_","gr54_","gr49_","gr56_","gr53_","gr51_","gr52_","gr52_","gr54_","gr53_","gr51_","gr55_","gr65_","gr54_","gr64_","gr53_","gr52_","gr52_","gr51_","gr55_","gr56_","gr57_","gr63_","gr49_","gr49_","gr52_","gr50_","gr51_","gr50_","gr54_","gr65_","gr56_","gr55_","gr69_","gr51_","gr50_","gr49_","gr52_","gr49_","gr52_","gr54_","gr49_"],
|
||||||
|
["gr68_","gr55_","gr54_","gr55_","gr71_","gr54_","gr55_","gr50_","gr56_","gr58_","gr50_","gr53_","gr51_","gr54_","gr51_","gr55_","gr56_","gr52_","gr53_","gr49_","gr56_","gr54_","gr52_","gr49_","gr52_","gr53_","gr49_","gr51_","gr54_","gr54_","gr49_","gr59_","gr53_","gr56_","gr54_","gr60_","gr53_","gr56_","gr53_","gr53_","gr61_","gr54_","gr55_","gr70_","gr24-","rc16_","rc19_","gr25_","gr52_","gr70_","gr51_","gr49_","gr54_","gr53_","gr52_","gr51_","gr68_","gr50_","gr52_","gr63_","gr49_","gr65_","gr56_","gr50_","gr61_","gr59_","gr50_","gr55_","gr51_","gr52_","gr55_","gr53_","gr49_","gr51_","gr55_","gr52_","gr51_","gr53_","gr49_","gr52_","gr56_","gr49_","gr52_","gr63_","gr51_","gr53_","gr55_","gr50_","gr51_","gr56_","gr50_","gr56_","gr60_","gr54_","gr50_","gr54_","gr52_","gr55_","gr57_","gr72_","gr55_","gr56_","gr52_","gr50_","gr52_","gr49_","gr59_","gr56_","gr53_","gr54_","gr52_","gr55_","gr51_","gr54_","gr49_","gr50_","gr71_","gr54_","gr69_","gr54_","gr50_","gr55_","gr51_","gr54_","gr54_","gr52_","gr55_","gr64_","gr51_","gr53_","gr51_","gr53_","gr51_","gr54_","gr52_","gr53_","gr54_","gr49_","gr50_","gr49_","gr55_","gr56_","gr67_","gr63_"],
|
||||||
|
["gr53_","gr52_","gr49_","gr58_","gr51_","gr49_","gr55_","gr55_","gr56_","gr55_","gr56_","gr49_","gr56_","gr51_","gr56_","gr70_","gr49_","gr51_","gr49_","gr56_","gr55_","gr54_","gr71_","gr53_","gr56_","gr50_","gr52_","gr55_","gr56_","gr51_","gr53_","gr53_","gr55_","gr51_","gr52_","gr55_","gr54_","gr53_","gr52_","gr54_","gr54_","gr49_","gr64_","gr50_","gr25-","rc17_","rc19_","gr24_","gr54_","gr51_","gr65_","gr56_","gr49_","gr54_","gr70_","gr50_","gr57_","gr68_","gr50_","gr50_","gr49_","gr64_","gr51_","gr55_","gr55_","gr52_","gr50_","gr58_","gr56_","gr58_","gr52_","gr50_","gr50_","gr51_","gr51_","gr56_","gr64_","gr52_","gr67_","gr51_","gr50_","gr68_","gr53_","gr53_","gr67_","gr56_","gr72_","gr53_","gr49_","gr55_","gr51_","gr51_","gr56_","gr54_","gr51_","gr55_","gr55_","gr53_","gr51_","gr50_","gr49_","gr56_","gr56_","gr51_","gr54_","gr55_","gr49_","gr51_","gr56_","gr55_","gr53_","gr50_","gr54_","gr71_","gr68_","gr56_","gr52_","gr51_","gr53_","gr52_","gr56_","gr52_","gr55_","gr49_","gr71_","gr54_","gr63_","gr52_","gr54_","gr56_","gr56_","gr63_","gr50_","gr56_","gr70_","gr65_","gr49_","gr53_","gr51_","gr52_","gr62_","gr51_","gr51_","gr53_"],
|
||||||
|
["gr57_","gr50_","gr55_","gr56_","gr52_","gr55_","gr69_","gr49_","gr71_","gr50_","gr54_","gr60_","gr53_","gr70_","gr63_","gr54_","gr53_","gr69_","gr56_","gr50_","gr50_","gr49_","gr56_","gr69_","gr51_","gr51_","gr64_","gr50_","gr60_","gr56_","gr51_","gr62_","gr51_","gr55_","gr53_","gr53_","gr68_","gr53_","gr56_","gr68_","gr53_","gr49_","gr56_","gr68_","gr24-","rc16_","rc19_","gr27_","gr51_","gr50_","gr52_","gr57_","gr49_","gr51_","gr53_","gr70_","gr53_","gr59_","gr56_","gr53_","gr49_","gr54_","gr55_","gr52_","gr52_","gr53_","gr53_","gr55_","gr66_","gr52_","gr55_","gr51_","gr58_","gr49_","gr54_","gr50_","gr55_","gr67_","gr71_","gr50_","gr56_","gr49_","gr50_","gr54_","gr55_","gr70_","gr54_","gr52_","gr69_","gr52_","gr51_","gr53_","gr53_","gr54_","gr55_","gr72_","gr61_","gr53_","gr50_","gr55_","gr64_","gr60_","gr49_","gr64_","gr55_","gr51_","gr55_","gr53_","gr51_","gr55_","gr63_","gr52_","gr52_","gr49_","gr52_","gr72_","gr53_","gr59_","gr50_","gr55_","gr54_","gr54_","gr50_","gr50_","gr56_","gr55_","gr49_","gr56_","gr61_","gr53_","gr49_","gr52_","gr54_","gr53_","gr55_","gr50_","gr50_","gr70_","gr51_","gr53_","gr54_","gr53_","gr60_","gr52_"],
|
||||||
|
["gr55_","gr50_","gr49_","gr56_","gr50_","gr57_","gr49_","gr56_","gr53_","gr50_","gr52_","gr53_","gr51_","gr49_","gr55_","gr54_","gr68_","gr55_","gr52_","gr54_","gr50_","gr55_","gr63_","gr49_","gr53_","gr50_","gr51_","gr50_","gr56_","gr52_","gr59_","gr56_","gr50_","gr52_","gr65_","gr53_","gr54_","gr64_","gr51_","gr53_","gr51_","gr55_","gr49_","gr53_","gr25-","rc16_","rc18_","gr25_","gr66_","gr50_","gr58_","gr69_","gr70_","gr51_","gr51_","gr53_","gr55_","gr64_","gr53_","gr53_","gr50_","gr52_","gr54_","gr58_","gr52_","gr56_","gr53_","gr55_","gr49_","gr56_","gr56_","gr49_","gr49_","gr53_","gr49_","gr50_","gr54_","gr49_","gr52_","gr50_","gr72_","gr55_","gr51_","gr49_","gr49_","gr56_","gr58_","gr55_","gr49_","gr62_","gr51_","gr53_","gr50_","gr53_","gr51_","gr49_","gr69_","gr53_","gr68_","gr70_","gr52_","gr50_","gr49_","gr49_","gr54_","gr68_","gr53_","gr53_","gr55_","gr63_","gr52_","gr64_","gr53_","gr52_","gr71_","gr51_","gr51_","gr54_","gr53_","gr54_","gr49_","gr62_","gr53_","gr66_","gr51_","gr56_","gr53_","gr53_","gr54_","gr51_","gr54_","gr50_","gr54_","gr53_","gr53_","gr54_","gr50_","gr53_","gr51_","gr69_","gr62_","gr55_","gr54_","gr50_"],
|
||||||
|
["gr57_","gr51_","gr55_","gr58_","gr53_","gr54_","gr50_","gr50_","gr57_","gr55_","gr49_","gr52_","gr50_","gr52_","gr49_","gr55_","gr53_","gr51_","gr51_","gr52_","gr63_","gr49_","gr52_","gr57_","gr62_","gr70_","gr54_","gr50_","gr53_","gr55_","gr52_","gr51_","gr52_","gr67_","gr50_","gr55_","gr53_","gr55_","gr51_","gr52_","gr56_","gr50_","gr49_","gr52_","gr26-","rc16_","rc18_","gr25_","gr52_","gr68_","gr52_","gr51_","gr55_","gr54_","gr55_","gr65_","gr49_","gr49_","gr51_","gr68_","gr51_","gr49_","gr54_","gr56_","gr55_","gr68_","gr56_","gr56_","gr69_","gr57_","gr55_","gr50_","gr63_","gr53_","gr60_","gr49_","gr62_","gr55_","gr52_","gr50_","gr51_","gr62_","gr55_","gr71_","gr55_","gr53_","gr52_","gr55_","gr51_","gr54_","gr52_","gr51_","gr65_","gr52_","gr50_","gr59_","gr56_","gr55_","gr49_","gr55_","gr53_","gr52_","gr54_","gr54_","gr53_","gr50_","gr50_","gr51_","gr51_","gr55_","gr50_","gr51_","gr56_","gr49_","gr54_","gr56_","gr54_","gr69_","gr53_","gr49_","gr52_","gr51_","gr55_","gr56_","gr54_","gr56_","gr50_","gr51_","gr50_","gr51_","gr70_","gr51_","gr51_","gr72_","gr49_","gr72_","gr49_","gr65_","gr52_","gr50_","gr56_","gr55_","gr59_","gr49_"],
|
||||||
|
["gr53_","gr53_","gr49_","gr55_","gr60_","gr54_","gr49_","gr49_","gr69_","gr50_","gr55_","gr66_","gr49_","gr53_","gr53_","gr56_","gr50_","gr56_","gr54_","gr52_","gr49_","gr70_","gr55_","gr54_","gr62_","gr56_","gr56_","gr55_","gr51_","gr50_","gr56_","gr53_","gr57_","gr51_","gr54_","gr59_","gr65_","gr64_","gr49_","gr54_","gr52_","gr66_","gr49_","gr49_","gr24-","rc17_","rc19_","gr25_","gr49_","gr70_","gr49_","gr51_","gr54_","gr61_","gr56_","gr50_","gr49_","gr65_","gr56_","gr65_","gr54_","gr69_","gr56_","gr54_","gr52_","gr50_","gr55_","gr52_","gr54_","gr52_","gr52_","gr49_","gr51_","gr51_","gr54_","gr54_","gr55_","gr52_","gr53_","gr50_","gr56_","gr62_","gr56_","gr55_","gr50_","gr53_","gr68_","gr51_","gr52_","gr59_","gr52_","gr56_","gr56_","gr49_","gr59_","gr53_","gr54_","gr50_","gr51_","gr67_","gr50_","gr49_","gr50_","gr56_","gr50_","gr70_","gr55_","gr55_","gr49_","gr69_","gr50_","gr55_","gr54_","gr55_","gr49_","gr56_","gr70_","gr55_","gr68_","gr49_","gr54_","gr70_","gr50_","gr52_","gr65_","gr55_","gr49_","gr72_","gr56_","gr68_","gr50_","gr54_","gr53_","gr55_","gr59_","gr53_","gr55_","gr66_","gr51_","gr54_","gr50_","gr56_","gr50_","gr49_"],
|
||||||
|
["gr68_","gr49_","gr54_","gr70_","gr56_","gr50_","gr55_","gr52_","gr55_","gr50_","gr52_","gr54_","gr58_","gr54_","gr51_","gr49_","gr49_","gr54_","gr53_","gr55_","gr55_","gr55_","gr55_","gr55_","gr52_","gr55_","gr51_","gr51_","gr66_","gr51_","gr53_","gr56_","gr56_","gr60_","gr54_","gr50_","gr58_","gr54_","gr53_","gr53_","gr55_","gr56_","gr57_","gr53_","gr27-","rc16_","rc18_","gr24_","gr49_","gr50_","gr51_","gr69_","gr49_","gr55_","gr55_","gr54_","gr64_","gr53_","gr53_","gr52_","gr49_","gr56_","gr67_","gr61_","gr52_","gr49_","gr50_","gr50_","gr52_","gr51_","gr54_","gr51_","gr55_","gr55_","gr57_","gr49_","gr57_","gr56_","gr72_","gr50_","gr57_","gr56_","gr60_","gr49_","gr66_","gr49_","gr50_","gr51_","gr51_","gr53_","gr51_","gr59_","gr56_","gr54_","gr53_","gr55_","gr55_","gr55_","gr49_","gr72_","gr52_","gr49_","gr67_","gr54_","gr54_","gr55_","gr68_","gr50_","gr55_","gr51_","gr51_","gr51_","gr56_","gr54_","gr64_","gr49_","gr66_","gr52_","gr56_","gr53_","gr54_","gr53_","gr52_","gr63_","gr54_","gr54_","gr50_","gr54_","gr50_","gr54_","gr50_","gr68_","gr52_","gr49_","gr50_","gr71_","gr52_","gr64_","gr51_","gr49_","gr53_","gr71_","gr50_","gr56_"],
|
||||||
|
["gr54_","gr54_","gr56_","gr55_","gr49_","gr49_","gr50_","gr52_","gr56_","gr55_","gr49_","gr56_","gr51_","gr55_","gr50_","gr50_","gr51_","gr54_","gr56_","gr52_","gr51_","gr50_","gr53_","gr52_","gr49_","gr67_","gr53_","gr53_","gr49_","gr52_","gr60_","gr51_","gr51_","gr55_","gr50_","gr51_","gr56_","gr54_","gr70_","gr56_","gr49_","gr67_","gr56_","gr71_","gr26-","rc17_","rc19_","gr25_","gr52_","gr56_","gr56_","gr50_","gr49_","gr60_","gr52_","gr63_","gr54_","gr55_","gr50_","gr54_","gr54_","gr59_","gr49_","gr68_","gr55_","gr49_","gr56_","gr51_","gr62_","gr53_","gr62_","gr50_","gr49_","gr71_","gr51_","gr50_","gr51_","gr60_","gr53_","gr51_","gr52_","gr51_","gr52_","gr69_","gr55_","gr56_","gr53_","gr56_","gr66_","gr52_","gr67_","gr52_","gr49_","gr51_","gr49_","gr49_","gr51_","gr52_","gr50_","gr49_","gr59_","gr53_","gr49_","gr49_","gr56_","gr53_","gr49_","gr51_","gr54_","gr56_","gr55_","gr55_","gr51_","gr63_","gr59_","gr69_","gr51_","gr53_","gr50_","gr61_","gr53_","gr66_","gr71_","gr56_","gr51_","gr52_","gr61_","gr60_","gr54_","gr49_","gr62_","gr52_","gr55_","gr55_","gr56_","gr53_","gr55_","gr52_","gr51_","gr50_","gr72_","gr54_","gr60_","gr56_"],
|
||||||
|
["gr50_","gr52_","gr69_","gr51_","gr63_","gr51_","gr50_","gr56_","gr55_","gr50_","gr54_","gr65_","gr53_","gr62_","gr52_","gr52_","gr56_","gr55_","gr54_","gr68_","gr51_","gr49_","gr50_","gr54_","gr53_","gr52_","gr55_","gr53_","gr66_","gr53_","gr52_","gr63_","gr56_","gr59_","gr50_","gr70_","gr51_","gr50_","gr54_","gr56_","gr49_","gr51_","gr56_","gr71_","gr27-","rc17_","rc18_","gr24_","gr50_","gr54_","gr57_","gr49_","gr54_","gr53_","gr63_","gr53_","gr51_","gr70_","gr55_","gr54_","gr51_","gr53_","gr56_","gr51_","gr53_","gr51_","gr59_","gr54_","gr53_","gr59_","gr52_","gr53_","gr50_","gr53_","gr53_","gr50_","gr71_","gr55_","gr51_","gr60_","gr50_","gr55_","gr71_","gr52_","gr56_","gr50_","gr71_","gr65_","gr55_","gr49_","gr50_","gr52_","gr66_","gr70_","gr55_","gr52_","gr57_","gr60_","gr55_","gr59_","gr55_","gr60_","gr54_","gr55_","gr50_","gr49_","gr54_","gr51_","gr70_","gr53_","gr52_","gr52_","gr50_","gr49_","gr49_","gr52_","gr49_","gr49_","gr66_","gr50_","gr51_","gr53_","gr49_","gr55_","gr50_","gr49_","gr50_","gr50_","gr53_","gr54_","gr54_","gr54_","gr56_","gr55_","gr51_","gr71_","gr50_","gr53_","gr66_","gr49_","gr53_","gr68_","gr56_","gr49_"],
|
||||||
|
["gr49_","gr52_","gr54_","gr49_","gr50_","gr72_","gr65_","gr56_","gr54_","gr50_","gr50_","gr72_","gr56_","gr53_","gr55_","gr54_","gr56_","gr50_","gr56_","gr54_","gr56_","gr52_","gr67_","gr52_","gr56_","gr51_","gr57_","gr52_","gr51_","gr53_","gr55_","gr51_","gr56_","gr56_","gr54_","gr51_","gr50_","gr57_","gr51_","gr52_","gr56_","gr49_","gr55_","gr53_","gr24-","rc17_","rc18_","gr24_","gr50_","gr54_","gr54_","gr51_","gr72_","gr57_","gr55_","gr54_","gr54_","gr50_","gr52_","gr52_","gr56_","gr54_","gr65_","gr50_","gr54_","gr53_","gr49_","gr67_","gr49_","gr51_","gr72_","gr52_","gr50_","gr56_","gr55_","gr56_","gr51_","gr49_","gr52_","gr53_","gr51_","gr53_","gr55_","gr53_","gr54_","gr56_","gr54_","gr54_","gr67_","gr67_","gr49_","gr58_","gr53_","gr49_","gr55_","gr55_","gr51_","gr52_","gr56_","gr56_","gr55_","gr71_","gr56_","gr58_","gr51_","gr49_","gr59_","gr65_","gr55_","gr56_","gr51_","gr49_","gr52_","gr52_","gr59_","gr52_","gr52_","gr56_","gr56_","gr50_","gr56_","gr52_","gr66_","gr53_","gr49_","gr54_","gr64_","gr49_","gr55_","gr52_","gr49_","gr50_","gr69_","gr51_","gr52_","gr62_","gr51_","gr52_","gr57_","gr54_","gr50_","gr49_","gr70_","gr49_"],
|
||||||
|
["gr52_","gr60_","gr59_","gr49_","gr58_","gr49_","gr69_","gr52_","gr51_","gr55_","gr71_","gr53_","gr68_","gr51_","gr52_","gr49_","gr58_","gr53_","gr55_","gr50_","gr50_","gr57_","gr51_","gr62_","gr58_","gr55_","gr51_","gr65_","gr53_","gr52_","gr51_","gr71_","gr51_","gr54_","gr53_","gr51_","gr54_","gr52_","gr54_","gr52_","gr54_","gr51_","gr54_","gr50_","gr26-","rc16_","rc19_","gr25_","gr53_","gr56_","gr55_","gr70_","gr54_","gr56_","gr53_","gr52_","gr56_","gr52_","gr56_","gr49_","gr71_","gr55_","gr52_","gr50_","gr49_","gr49_","gr51_","gr51_","gr50_","gr55_","gr50_","gr56_","gr56_","gr65_","gr49_","gr53_","gr56_","gr50_","gr54_","gr71_","gr55_","gr51_","gr50_","gr56_","gr49_","gr49_","gr51_","gr71_","gr54_","gr50_","gr49_","gr54_","gr56_","gr52_","gr49_","gr51_","gr55_","gr54_","gr60_","gr55_","gr53_","gr52_","gr49_","gr50_","gr66_","gr56_","gr55_","gr53_","gr65_","gr60_","gr52_","gr54_","gr64_","gr56_","gr49_","gr63_","gr52_","gr66_","gr60_","gr56_","gr51_","gr49_","gr52_","gr49_","gr49_","gr50_","gr56_","gr56_","gr52_","gr51_","gr49_","gr49_","gr55_","gr51_","gr51_","gr49_","gr50_","gr55_","gr72_","gr50_","gr49_","gr62_","gr69_","gr66_"],
|
||||||
|
["gr49_","gr55_","gr59_","gr52_","gr70_","gr53_","gr55_","gr53_","gr55_","gr50_","gr51_","gr56_","gr56_","gr57_","gr51_","gr67_","gr64_","gr50_","gr64_","gr56_","gr49_","gr50_","gr49_","gr53_","gr50_","gr49_","gr53_","gr68_","gr56_","gr50_","gr50_","gr52_","gr56_","gr62_","gr49_","gr62_","gr55_","gr49_","gr71_","gr56_","gr51_","gr52_","gr53_","gr53_","gr24-","rc16_","rc19_","gr24_","gr51_","gr50_","gr51_","gr52_","gr49_","gr67_","gr57_","gr54_","gr65_","gr51_","gr52_","gr52_","gr54_","gr63_","gr49_","gr50_","gr55_","gr63_","gr49_","gr53_","gr55_","gr63_","gr57_","gr56_","gr62_","gr55_","gr50_","gr64_","gr53_","gr51_","gr58_","gr49_","gr54_","gr52_","gr50_","gr62_","gr49_","gr53_","gr54_","gr53_","gr56_","gr63_","gr55_","gr49_","gr52_","gr53_","gr52_","gr54_","gr62_","gr49_","gr53_","gr49_","gr71_","gr53_","gr55_","gr54_","gr56_","gr59_","gr51_","gr71_","gr51_","gr54_","gr55_","gr67_","gr55_","gr54_","gr51_","gr53_","gr49_","gr56_","gr69_","gr49_","gr54_","gr60_","gr54_","gr51_","gr49_","gr53_","gr58_","gr56_","gr59_","gr52_","gr68_","gr50_","gr70_","gr53_","gr56_","gr56_","gr57_","gr57_","gr55_","gr52_","gr56_","gr50_","gr55_","gr51_"],
|
||||||
|
["gr49_","gr58_","gr56_","gr49_","gr55_","gr53_","gr55_","gr50_","gr50_","gr58_","gr55_","gr50_","gr54_","gr54_","gr52_","gr54_","gr64_","gr49_","gr54_","gr49_","gr52_","gr54_","gr52_","gr56_","gr50_","gr55_","gr70_","gr54_","gr52_","gr56_","gr50_","gr56_","gr49_","gr55_","gr56_","gr50_","gr53_","gr66_","gr53_","gr49_","gr55_","gr49_","gr52_","gr55_","gr27-","rc16_","rc18_","gr25_","gr52_","gr54_","gr68_","gr53_","gr49_","gr49_","gr67_","gr53_","gr49_","gr55_","gr56_","gr53_","gr55_","gr54_","gr56_","gr51_","gr56_","gr54_","gr59_","gr49_","gr50_","gr49_","gr54_","gr61_","gr50_","gr50_","gr60_","gr49_","gr52_","gr51_","gr56_","gr51_","gr55_","gr53_","gr61_","gr54_","gr54_","gr60_","gr54_","gr55_","gr56_","gr57_","gr54_","gr58_","gr49_","gr62_","gr49_","gr51_","gr55_","gr53_","gr49_","gr52_","gr54_","gr50_","gr67_","gr53_","gr53_","gr52_","gr55_","gr64_","gr54_","gr56_","gr51_","gr65_","gr49_","gr61_","gr49_","gr68_","gr50_","gr49_","gr52_","gr55_","gr71_","gr51_","gr71_","gr51_","gr59_","gr63_","gr54_","gr55_","gr53_","gr54_","gr51_","gr54_","gr50_","gr59_","gr50_","gr52_","gr55_","gr55_","gr62_","gr52_","gr55_","gr54_","gr50_","gr53_"],
|
||||||
|
["gr51_","gr55_","gr56_","gr56_","gr53_","gr55_","gr53_","gr52_","gr52_","gr55_","gr51_","gr50_","gr52_","gr58_","gr54_","gr58_","gr51_","gr56_","gr64_","gr52_","gr52_","gr54_","gr53_","gr71_","gr56_","gr51_","gr55_","gr54_","gr56_","gr69_","gr51_","gr54_","gr52_","gr50_","gr58_","gr65_","gr55_","gr55_","gr50_","gr54_","gr49_","gr52_","gr58_","gr55_","gr25-","rc16_","rc19_","gr25_","gr55_","gr52_","gr56_","gr55_","gr54_","gr50_","gr51_","gr64_","gr56_","gr49_","gr52_","gr61_","gr56_","gr53_","gr72_","gr52_","gr52_","gr54_","gr56_","gr55_","gr49_","gr55_","gr49_","gr53_","gr53_","gr58_","gr53_","gr64_","gr51_","gr51_","gr72_","gr54_","gr51_","gr56_","gr51_","gr64_","gr56_","gr55_","gr53_","gr54_","gr56_","gr56_","gr52_","gr65_","gr55_","gr54_","gr56_","gr55_","gr60_","gr51_","gr65_","gr51_","gr50_","gr49_","gr52_","gr50_","gr56_","gr50_","gr51_","gr55_","gr50_","gr49_","gr50_","gr56_","gr54_","gr54_","gr50_","gr62_","gr56_","gr54_","gr57_","gr49_","gr55_","gr56_","gr56_","gr50_","gr53_","gr49_","gr52_","gr63_","gr51_","gr49_","gr54_","gr51_","gr50_","gr68_","gr51_","gr52_","gr51_","gr59_","gr52_","gr51_","gr56_","gr56_","gr55_","gr55_"],
|
||||||
|
["gr49_","gr53_","gr52_","gr66_","gr56_","gr53_","gr49_","gr50_","gr61_","gr50_","gr55_","gr49_","gr59_","gr53_","gr58_","gr53_","gr49_","gr57_","gr53_","gr57_","gr49_","gr49_","gr68_","gr51_","gr53_","gr53_","gr56_","gr52_","gr53_","gr49_","gr55_","gr51_","gr50_","gr53_","gr49_","gr50_","gr55_","gr54_","gr52_","gr55_","gr50_","gr60_","gr49_","gr53_","gr24-","rc17_","rc19_","gr25_","gr62_","gr50_","gr56_","gr52_","gr56_","gr54_","gr49_","gr55_","gr62_","gr56_","gr56_","gr58_","gr50_","gr51_","gr50_","gr53_","gr59_","gr63_","gr50_","gr72_","gr53_","gr49_","gr58_","gr50_","gr63_","gr56_","gr54_","gr54_","gr52_","gr49_","gr49_","gr49_","gr50_","gr60_","gr54_","gr53_","gr54_","gr69_","gr49_","gr49_","gr62_","gr53_","gr51_","gr54_","gr53_","gr70_","gr49_","gr52_","gr51_","gr50_","gr53_","gr51_","gr59_","gr52_","gr52_","gr50_","gr67_","gr69_","gr54_","gr52_","gr55_","gr65_","gr50_","gr70_","gr54_","gr64_","gr63_","gr66_","gr51_","gr61_","gr52_","gr63_","gr54_","gr50_","gr57_","gr55_","gr56_","gr50_","gr51_","gr56_","gr51_","gr70_","gr52_","gr51_","gr55_","gr49_","gr49_","gr56_","gr54_","gr52_","gr50_","gr72_","gr49_","gr50_","gr53_","gr49_"],
|
||||||
|
["gr49_","gr69_","gr52_","gr53_","gr55_","gr55_","gr50_","gr68_","gr52_","gr49_","gr50_","gr53_","gr50_","gr56_","gr49_","gr49_","gr49_","gr51_","gr54_","gr49_","gr51_","gr55_","gr49_","gr51_","gr56_","gr51_","gr49_","gr49_","gr51_","gr52_","gr52_","gr57_","gr51_","gr50_","gr52_","gr54_","gr51_","gr50_","gr52_","gr53_","gr58_","gr50_","gr55_","gr57_","gr25-","rc16_","rc18_","gr25_","gr55_","gr50_","gr60_","gr52_","gr55_","gr54_","gr68_","gr51_","gr50_","gr68_","gr51_","gr55_","gr52_","gr72_","gr54_","gr70_","gr53_","gr50_","gr55_","gr51_","gr54_","gr53_","gr49_","gr51_","gr56_","gr51_","gr63_","gr50_","gr53_","gr55_","gr53_","gr60_","gr52_","gr50_","gr68_","gr60_","gr49_","gr55_","gr67_","gr64_","gr51_","gr54_","gr57_","gr50_","gr69_","gr53_","gr52_","gr49_","gr53_","gr50_","gr53_","gr54_","gr56_","gr59_","gr65_","gr55_","gr52_","gr62_","gr50_","gr56_","gr53_","gr49_","gr52_","gr53_","gr72_","gr51_","gr56_","gr57_","gr51_","gr49_","gr53_","gr58_","gr51_","gr50_","gr50_","gr51_","gr52_","gr51_","gr53_","gr56_","gr53_","gr52_","gr55_","gr54_","gr65_","gr49_","gr53_","gr56_","gr56_","gr50_","gr56_","gr51_","gr52_","gr51_","gr62_","gr51_"],
|
||||||
|
["gr52_","gr53_","gr56_","gr52_","gr52_","gr52_","gr50_","gr66_","gr51_","gr63_","gr54_","gr49_","gr67_","gr50_","gr56_","gr61_","gr53_","gr55_","gr51_","gr51_","gr66_","gr49_","gr51_","gr63_","gr51_","gr71_","gr50_","gr51_","gr66_","gr55_","gr52_","gr55_","gr71_","gr49_","gr66_","gr51_","gr52_","gr72_","gr50_","gr55_","gr49_","gr52_","gr53_","gr52_","gr24-","rc16_","rc19_","gr24_","gr51_","gr51_","gr51_","gr69_","gr50_","gr49_","gr53_","gr50_","gr53_","gr54_","gr55_","gr49_","gr56_","gr53_","gr52_","gr56_","gr49_","gr54_","gr56_","gr56_","gr52_","gr53_","gr54_","gr49_","gr55_","gr52_","gr55_","gr52_","gr54_","gr53_","gr50_","gr55_","gr65_","gr49_","gr55_","gr61_","gr49_","gr52_","gr51_","gr51_","gr55_","gr54_","gr55_","gr60_","gr53_","gr51_","gr72_","gr54_","gr50_","gr68_","gr49_","gr67_","gr58_","gr52_","gr52_","gr57_","gr60_","gr52_","gr53_","gr50_","gr67_","gr56_","gr72_","gr52_","gr54_","gr55_","gr61_","gr58_","gr63_","gr55_","gr51_","gr49_","gr56_","gr55_","gr50_","gr52_","gr49_","gr67_","gr72_","gr49_","gr51_","gr59_","gr53_","gr58_","gr56_","gr52_","gr54_","gr53_","gr49_","gr54_","gr54_","gr52_","gr55_","gr60_","gr56_","gr54_"],
|
||||||
|
["gr66_","gr55_","gr55_","gr60_","gr53_","gr52_","gr71_","gr53_","gr56_","gr49_","gr65_","gr50_","gr52_","gr52_","gr50_","gr50_","gr51_","gr52_","gr52_","gr55_","gr54_","gr53_","gr68_","gr55_","gr52_","gr49_","gr50_","gr61_","gr50_","gr50_","gr53_","gr53_","gr53_","gr49_","gr52_","gr51_","gr50_","gr49_","gr54_","gr69_","gr55_","gr53_","gr51_","gr61_","gr26-","rc16_","rc18_","gr27_","gr50_","gr54_","gr55_","gr49_","gr50_","gr56_","gr60_","gr54_","gr55_","gr53_","gr58_","gr50_","gr52_","gr56_","gr52_","gr50_","gr64_","gr51_","gr52_","gr64_","gr54_","gr49_","gr56_","gr51_","gr53_","gr49_","gr56_","gr61_","gr49_","gr65_","gr49_","gr51_","gr56_","gr57_","gr53_","gr56_","gr54_","gr52_","gr56_","gr59_","gr49_","gr50_","gr52_","gr61_","gr54_","gr49_","gr63_","gr52_","gr50_","gr55_","gr56_","gr50_","gr49_","gr49_","gr69_","gr54_","gr51_","gr55_","gr56_","gr50_","gr50_","gr54_","gr53_","gr51_","gr54_","gr53_","gr54_","gr53_","gr49_","gr49_","gr71_","gr61_","gr51_","gr65_","gr50_","gr68_","gr55_","gr50_","gr53_","gr51_","gr59_","gr52_","gr63_","gr49_","gr60_","gr51_","gr70_","gr54_","gr56_","gr55_","gr52_","gr60_","gr51_","gr52_","gr53_","gr49_"],
|
||||||
|
["gr51_","gr51_","gr50_","gr55_","gr67_","gr55_","gr50_","gr60_","gr51_","gr49_","gr68_","gr50_","gr55_","gr52_","gr54_","gr55_","gr52_","gr50_","gr49_","gr70_","gr54_","gr53_","gr50_","gr60_","gr52_","gr55_","gr51_","gr52_","gr66_","gr51_","gr55_","gr52_","gr55_","gr50_","gr50_","gr54_","gr61_","gr54_","gr63_","gr72_","gr51_","gr50_","gr72_","gr52_","gr24-","rc16_","rc18_","gr27_","gr51_","gr49_","gr54_","gr55_","gr63_","gr50_","gr49_","gr55_","gr72_","gr49_","gr53_","gr49_","gr49_","gr52_","gr54_","gr68_","gr50_","gr50_","gr53_","gr50_","gr69_","gr55_","gr56_","gr49_","gr59_","gr52_","gr72_","gr52_","gr60_","gr53_","gr50_","gr55_","gr50_","gr50_","gr55_","gr54_","gr72_","gr55_","gr52_","gr55_","gr59_","gr52_","gr50_","gr59_","gr55_","gr53_","gr55_","gr50_","gr69_","gr67_","gr51_","gr68_","gr53_","gr65_","gr52_","gr56_","gr49_","gr56_","gr51_","gr56_","gr58_","gr52_","gr53_","gr51_","gr49_","gr52_","gr58_","gr50_","gr55_","gr54_","gr49_","gr52_","gr53_","gr56_","gr51_","gr51_","gr53_","gr56_","gr51_","gr52_","gr54_","gr54_","gr53_","gr59_","gr53_","gr52_","gr67_","gr52_","gr55_","gr53_","gr49_","gr51_","gr71_","gr51_","gr51_","gr52_"],
|
||||||
|
["gr62_","gr55_","gr57_","gr60_","gr54_","gr70_","gr50_","gr71_","gr54_","gr54_","gr54_","gr56_","gr50_","gr52_","gr51_","gr68_","gr56_","gr57_","gr49_","gr55_","gr51_","gr49_","gr54_","gr53_","gr67_","gr51_","gr59_","gr50_","gr68_","gr52_","gr60_","gr51_","gr51_","gr52_","gr52_","gr51_","gr52_","gr55_","gr55_","gr55_","gr63_","gr53_","gr54_","gr50_","gr25-","rc16_","rc19_","gr24_","gr56_","gr55_","gr65_","gr56_","gr49_","gr55_","gr60_","gr52_","gr56_","gr51_","gr55_","gr55_","gr55_","gr70_","gr49_","gr55_","gr55_","gr50_","gr49_","gr55_","gr50_","gr49_","gr70_","gr68_","gr54_","gr61_","gr56_","gr49_","gr49_","gr65_","gr52_","gr52_","gr56_","gr69_","gr52_","gr54_","gr54_","gr70_","gr53_","gr55_","gr51_","gr51_","gr63_","gr56_","gr50_","gr49_","gr49_","gr72_","gr50_","gr49_","gr50_","gr56_","gr54_","gr53_","gr65_","gr54_","gr53_","gr54_","gr54_","gr53_","gr51_","gr65_","gr54_","gr51_","gr62_","gr60_","gr51_","gr50_","gr50_","gr54_","gr49_","gr56_","gr62_","gr53_","gr51_","gr56_","gr52_","gr70_","gr52_","gr62_","gr53_","gr49_","gr54_","gr54_","gr50_","gr50_","gr55_","gr54_","gr52_","gr65_","gr54_","gr55_","gr53_","gr50_","gr51_","gr56_"],
|
||||||
|
["gr60_","gr53_","gr52_","gr51_","gr54_","gr55_","gr49_","gr54_","gr64_","gr56_","gr49_","gr68_","gr53_","gr52_","gr50_","gr50_","gr54_","gr50_","gr53_","gr50_","gr53_","gr72_","gr56_","gr51_","gr49_","gr52_","gr51_","gr54_","gr54_","gr60_","gr51_","gr66_","gr50_","gr55_","gr49_","gr66_","gr64_","gr50_","gr52_","gr50_","gr49_","gr53_","gr51_","gr54_","gr27-","rc16_","rc18_","gr24_","gr55_","gr61_","gr56_","gr51_","gr56_","gr55_","gr52_","gr61_","gr54_","gr49_","gr50_","gr58_","gr54_","gr56_","gr54_","gr50_","gr54_","gr51_","gr49_","gr53_","gr66_","gr54_","gr50_","gr59_","gr49_","gr50_","gr64_","gr52_","gr54_","gr51_","gr49_","gr56_","gr55_","gr49_","gr54_","gr49_","gr65_","gr56_","gr52_","gr52_","gr50_","gr56_","gr52_","gr68_","gr53_","gr53_","gr52_","gr54_","gr50_","gr71_","gr53_","gr54_","gr52_","gr52_","gr51_","gr57_","gr49_","gr49_","gr56_","gr72_","gr53_","gr53_","gr49_","gr52_","gr55_","gr54_","gr55_","gr68_","gr50_","gr50_","gr55_","gr49_","gr53_","gr55_","gr50_","gr51_","gr68_","gr51_","gr54_","gr56_","gr53_","gr69_","gr68_","gr52_","gr52_","gr50_","gr56_","gr52_","gr56_","gr65_","gr51_","gr58_","gr59_","gr56_","gr52_","gr68_"],
|
||||||
|
["gr54_","gr61_","gr51_","gr53_","gr50_","gr53_","gr53_","gr50_","gr56_","gr56_","gr59_","gr55_","gr66_","gr50_","gr51_","gr55_","gr64_","gr52_","gr53_","gr55_","gr52_","gr50_","gr55_","gr52_","gr54_","gr51_","gr50_","gr56_","gr49_","gr52_","gr67_","gr50_","gr52_","gr52_","gr59_","gr51_","gr50_","gr65_","gr55_","gr50_","gr50_","gr50_","gr56_","gr64_","gr26-","rc16_","rc18_","gr24_","gr49_","gr53_","gr67_","gr56_","gr51_","gr51_","gr67_","gr50_","gr67_","gr53_","gr52_","gr52_","gr54_","gr49_","gr61_","gr53_","gr49_","gr53_","gr53_","gr54_","gr56_","gr55_","gr51_","gr54_","gr67_","gr53_","gr63_","gr54_","gr52_","gr53_","gr71_","gr53_","gr50_","gr70_","gr51_","gr54_","gr49_","gr53_","gr49_","gr53_","gr56_","gr57_","gr49_","gr53_","gr50_","gr56_","gr50_","gr53_","gr53_","gr56_","gr60_","gr55_","gr54_","gr54_","gr67_","gr55_","gr59_","gr50_","gr66_","gr50_","gr55_","gr64_","gr54_","gr52_","gr50_","gr49_","gr55_","gr49_","gr55_","gr57_","gr50_","gr69_","gr52_","gr63_","gr50_","gr68_","gr61_","gr55_","gr50_","gr59_","gr49_","gr51_","gr53_","gr52_","gr51_","gr54_","gr54_","gr54_","gr51_","gr56_","gr56_","gr51_","gr50_","gr53_","gr72_","gr49_"],
|
||||||
|
["gr66_","gr53_","gr54_","gr65_","gr51_","gr53_","gr55_","gr51_","gr71_","gr53_","gr54_","gr63_","gr55_","gr64_","gr54_","gr54_","gr52_","gr56_","gr57_","gr55_","gr56_","gr55_","gr53_","gr50_","gr49_","gr63_","gr50_","gr49_","gr60_","gr50_","gr53_","gr50_","gr56_","gr51_","gr56_","gr55_","gr71_","gr51_","gr55_","gr61_","gr49_","gr53_","gr61_","gr56_","gr25-","rc17_","rc18_","gr25_","gr54_","gr54_","gr49_","gr71_","gr51_","gr50_","gr55_","gr52_","gr55_","gr55_","gr54_","gr53_","gr54_","gr49_","gr70_","gr49_","gr70_","gr49_","gr53_","gr49_","gr67_","gr51_","gr51_","gr53_","gr51_","gr70_","gr55_","gr54_","gr50_","gr54_","gr55_","gr51_","gr64_","gr53_","gr52_","gr53_","gr62_","gr54_","gr52_","gr50_","gr53_","gr56_","gr54_","gr69_","gr55_","gr50_","gr49_","gr52_","gr59_","gr49_","gr54_","gr49_","gr53_","gr51_","gr49_","gr51_","gr52_","gr56_","gr52_","gr66_","gr51_","gr59_","gr52_","gr53_","gr56_","gr53_","gr51_","gr55_","gr56_","gr51_","gr52_","gr62_","gr49_","gr51_","gr49_","gr51_","gr55_","gr59_","gr56_","gr54_","gr55_","gr58_","gr50_","gr55_","gr55_","gr53_","gr51_","gr61_","gr52_","gr59_","gr53_","gr50_","gr50_","gr49_","gr53_","gr53_"],
|
||||||
|
["gr56_","gr63_","gr52_","gr55_","gr50_","gr65_","gr55_","gr55_","gr53_","gr55_","gr56_","gr71_","gr54_","gr54_","gr51_","gr52_","gr51_","gr53_","gr49_","gr49_","gr56_","gr56_","gr56_","gr53_","gr52_","gr56_","gr57_","gr56_","gr65_","gr49_","gr49_","gr66_","gr56_","gr50_","gr49_","gr53_","gr50_","gr49_","gr54_","gr54_","gr56_","gr69_","gr49_","gr55_","gr25-","rc16_","rc19_","gr26_","gr54_","gr56_","gr51_","gr49_","gr56_","gr52_","gr65_","gr50_","gr50_","gr54_","gr64_","gr51_","gr63_","gr49_","gr56_","gr52_","gr54_","gr54_","gr49_","gr55_","gr50_","gr50_","gr56_","gr49_","gr66_","gr51_","gr54_","gr53_","gr58_","gr55_","gr49_","gr49_","gr56_","gr53_","gr65_","gr54_","gr56_","gr50_","gr52_","gr52_","gr72_","gr53_","gr51_","gr52_","gr52_","gr51_","gr50_","gr52_","gr52_","gr52_","gr52_","gr55_","gr57_","gr52_","gr53_","gr50_","gr52_","gr51_","gr54_","gr56_","gr55_","gr53_","gr53_","gr55_","gr49_","gr51_","gr58_","gr56_","gr70_","gr56_","gr51_","gr51_","gr53_","gr53_","gr49_","gr49_","gr49_","gr54_","gr56_","gr49_","gr65_","gr51_","gr51_","gr52_","gr64_","gr55_","gr54_","gr56_","gr53_","gr52_","gr58_","gr72_","gr51_","gr53_","gr52_","gr50_"],
|
||||||
|
["gr50_","gr50_","gr54_","gr56_","gr52_","gr56_","gr53_","gr56_","gr50_","gr55_","gr50_","gr52_","gr53_","gr50_","gr49_","gr59_","gr61_","gr51_","gr53_","gr54_","gr53_","gr68_","gr49_","gr51_","gr69_","gr54_","gr56_","gr54_","gr70_","gr70_","gr63_","gr51_","gr58_","gr51_","gr54_","gr69_","gr50_","gr66_","gr50_","gr50_","gr69_","gr50_","gr54_","gr68_","gr24-","rc17_","rc19_","gr26_","gr56_","gr52_","gr50_","gr53_","gr50_","gr50_","gr64_","gr52_","gr52_","gr50_","gr50_","gr72_","gr49_","gr56_","gr52_","gr49_","gr49_","gr53_","gr72_","gr55_","gr54_","gr68_","gr51_","gr65_","gr56_","gr54_","gr61_","gr50_","gr50_","gr55_","gr53_","gr71_","gr51_","gr54_","gr50_","gr58_","gr54_","gr49_","gr50_","gr50_","gr50_","gr55_","gr55_","gr56_","gr51_","gr52_","gr61_","gr52_","gr55_","gr56_","gr62_","gr54_","gr50_","gr56_","gr55_","gr54_","gr50_","gr51_","gr56_","gr68_","gr68_","gr55_","gr55_","gr56_","gr61_","gr50_","gr53_","gr52_","gr50_","gr49_","gr72_","gr53_","gr56_","gr53_","gr56_","gr54_","gr52_","gr56_","gr50_","gr52_","gr53_","gr52_","gr55_","gr51_","gr53_","gr53_","gr62_","gr71_","gr52_","gr50_","gr54_","gr52_","gr53_","gr72_","gr53_","gr55_"],
|
||||||
|
["gr54_","gr55_","gr52_","gr51_","gr52_","gr51_","gr49_","gr53_","gr53_","gr52_","gr51_","gr64_","gr53_","gr54_","gr57_","gr50_","gr50_","gr50_","gr52_","gr53_","gr55_","gr67_","gr56_","gr62_","gr52_","gr50_","gr55_","gr57_","gr53_","gr51_","gr54_","gr52_","gr55_","gr53_","gr70_","gr55_","gr70_","gr54_","gr61_","gr67_","gr50_","gr52_","gr50_","gr72_","gr27-","rc17_","rc19_","gr24_","gr54_","gr49_","gr52_","gr52_","gr49_","gr59_","gr54_","gr51_","gr60_","gr51_","gr52_","gr52_","gr60_","gr55_","gr51_","gr53_","gr54_","gr53_","gr52_","gr49_","gr55_","gr50_","gr52_","gr54_","gr61_","gr54_","gr52_","gr53_","gr51_","gr54_","gr50_","gr53_","gr65_","gr49_","gr54_","gr56_","gr49_","gr59_","gr71_","gr68_","gr52_","gr54_","gr67_","gr51_","gr67_","gr52_","gr50_","gr52_","gr53_","gr53_","gr52_","gr56_","gr56_","gr55_","gr62_","gr70_","gr56_","gr49_","gr50_","gr55_","gr50_","gr56_","gr51_","gr50_","gr52_","gr50_","gr69_","gr50_","gr49_","gr69_","gr51_","gr51_","gr50_","gr49_","gr54_","gr56_","gr56_","gr58_","gr61_","gr56_","gr52_","gr55_","gr56_","gr52_","gr71_","gr54_","gr52_","gr51_","gr50_","gr54_","gr66_","gr63_","gr55_","gr51_","gr56_","gr53_"],
|
||||||
|
["gr54_","gr53_","gr54_","gr72_","gr49_","gr49_","gr50_","gr63_","gr56_","gr62_","gr53_","gr50_","gr61_","gr49_","gr59_","gr49_","gr65_","gr51_","gr55_","gr54_","gr54_","gr54_","gr53_","gr54_","gr51_","gr51_","gr54_","gr51_","gr52_","gr55_","gr56_","gr53_","gr55_","gr57_","gr51_","gr60_","gr55_","gr53_","gr53_","gr72_","gr53_","gr52_","gr54_","gr50_","gr26-","rc17_","rc18_","gr25_","gr54_","gr63_","gr49_","gr60_","gr52_","gr55_","gr49_","gr70_","gr52_","gr50_","gr53_","gr53_","gr56_","gr52_","gr59_","gr50_","gr55_","gr70_","gr51_","gr54_","gr61_","gr51_","gr50_","gr54_","gr49_","gr52_","gr51_","gr54_","gr53_","gr52_","gr65_","gr52_","gr50_","gr53_","gr55_","gr56_","gr66_","gr49_","gr56_","gr59_","gr51_","gr66_","gr55_","gr53_","gr51_","gr51_","gr49_","gr60_","gr55_","gr52_","gr62_","gr52_","gr50_","gr58_","gr51_","gr50_","gr52_","gr52_","gr51_","gr56_","gr72_","gr64_","gr49_","gr53_","gr69_","gr52_","gr56_","gr49_","gr54_","gr61_","gr51_","gr53_","gr51_","gr67_","gr53_","gr49_","gr53_","gr67_","gr50_","gr52_","gr61_","gr52_","gr52_","gr72_","gr54_","gr66_","gr56_","gr51_","gr71_","gr62_","gr54_","gr55_","gr58_","gr52_","gr68_","gr51_"],
|
||||||
|
["gr64_","gr52_","gr52_","gr56_","gr58_","gr50_","gr49_","gr53_","gr49_","gr70_","gr54_","gr67_","gr55_","gr52_","gr55_","gr57_","gr51_","gr53_","gr54_","gr49_","gr50_","gr52_","gr55_","gr49_","gr49_","gr66_","gr53_","gr68_","gr51_","gr50_","gr51_","gr54_","gr65_","gr54_","gr51_","gr52_","gr53_","gr56_","gr50_","gr49_","gr54_","gr50_","gr50_","gr50_","gr27-","rc17_","rc19_","gr24_","gr49_","gr55_","gr51_","gr55_","gr52_","gr55_","gr66_","gr53_","gr50_","gr70_","gr54_","gr53_","gr52_","gr49_","gr52_","gr55_","gr50_","gr56_","gr54_","gr69_","gr56_","gr55_","gr55_","gr51_","gr51_","gr55_","gr49_","gr54_","gr56_","gr50_","gr50_","gr51_","gr53_","gr58_","gr51_","gr67_","gr54_","gr51_","gr56_","gr69_","gr50_","gr52_","gr51_","gr60_","gr52_","gr49_","gr57_","gr53_","gr50_","gr52_","gr59_","gr51_","gr57_","gr56_","gr55_","gr59_","gr55_","gr53_","gr52_","gr56_","gr55_","gr55_","gr49_","gr55_","gr49_","gr55_","gr54_","gr60_","gr56_","gr56_","gr50_","gr59_","gr50_","gr51_","gr52_","gr56_","gr51_","gr51_","gr65_","gr56_","gr50_","gr65_","gr52_","gr54_","gr50_","gr50_","gr49_","gr55_","gr50_","gr60_","gr50_","gr54_","gr54_","gr53_","gr51_","gr49_"],
|
||||||
|
["gr52_","gr53_","gr53_","gr50_","gr56_","gr54_","gr54_","gr55_","gr49_","gr51_","gr55_","gr50_","gr49_","gr70_","gr53_","gr49_","gr49_","gr56_","gr49_","gr55_","gr50_","gr69_","gr56_","gr49_","gr53_","gr53_","gr67_","gr50_","gr68_","gr53_","gr56_","gr56_","gr55_","gr52_","gr55_","gr53_","gr56_","gr54_","gr54_","gr55_","gr55_","gr52_","gr62_","gr56_","gr25-","rc17_","rc18_","gr27_","gr71_","gr56_","gr56_","gr53_","gr50_","gr49_","gr49_","gr64_","gr55_","gr55_","gr55_","gr52_","gr57_","gr53_","gr56_","gr53_","gr56_","gr52_","gr52_","gr54_","gr55_","gr55_","gr49_","gr61_","gr52_","gr63_","gr56_","gr52_","gr52_","gr55_","gr53_","gr50_","gr52_","gr49_","gr51_","gr56_","gr72_","gr55_","gr54_","gr53_","gr56_","gr51_","gr71_","gr50_","gr54_","gr55_","gr52_","gr62_","gr49_","gr54_","gr53_","gr51_","gr53_","gr49_","gr71_","gr56_","gr65_","gr51_","gr61_","gr69_","gr56_","gr62_","gr50_","gr50_","gr72_","gr51_","gr49_","gr56_","gr62_","gr54_","gr54_","gr54_","gr56_","gr71_","gr50_","gr62_","gr65_","gr51_","gr50_","gr61_","gr49_","gr56_","gr72_","gr55_","gr51_","gr53_","gr57_","gr56_","gr69_","gr56_","gr53_","gr52_","gr51_","gr62_","gr51_","gr56_"],
|
||||||
|
["gr52_","gr70_","gr50_","gr54_","gr51_","gr54_","gr49_","gr61_","gr56_","gr69_","gr56_","gr63_","gr52_","gr63_","gr52_","gr49_","gr49_","gr53_","gr63_","gr63_","gr55_","gr50_","gr54_","gr69_","gr56_","gr70_","gr57_","gr55_","gr54_","gr55_","gr55_","gr50_","gr55_","gr51_","gr55_","gr49_","gr56_","gr55_","gr63_","gr49_","gr54_","gr52_","gr57_","gr53_","gr25-","rc17_","rc18_","gr26_","gr55_","gr50_","gr49_","gr52_","gr59_","gr56_","gr54_","gr72_","gr50_","gr70_","gr56_","gr56_","gr55_","gr57_","gr53_","gr50_","gr49_","gr49_","gr55_","gr49_","gr51_","gr50_","gr49_","gr50_","gr52_","gr52_","gr70_","gr49_","gr56_","gr52_","gr50_","gr49_","gr69_","gr49_","gr55_","gr55_","gr55_","gr55_","gr65_","gr56_","gr52_","gr55_","gr50_","gr54_","gr56_","gr53_","gr72_","gr56_","gr67_","gr56_","gr50_","gr63_","gr54_","gr62_","gr54_","gr49_","gr50_","gr54_","gr62_","gr49_","gr49_","gr52_","gr70_","gr53_","gr50_","gr64_","gr55_","gr55_","gr49_","gr71_","gr56_","gr53_","gr53_","gr49_","gr56_","gr50_","gr49_","gr49_","gr61_","gr50_","gr51_","gr49_","gr56_","gr49_","gr56_","gr51_","gr54_","gr53_","gr54_","gr49_","gr65_","gr55_","gr49_","gr53_","gr53_","gr62_"],
|
||||||
|
["gr54_","gr49_","gr51_","gr53_","gr67_","gr49_","gr50_","gr56_","gr53_","gr52_","gr49_","gr50_","gr56_","gr72_","gr54_","gr50_","gr51_","gr50_","gr50_","gr49_","gr66_","gr49_","gr50_","gr54_","gr66_","gr53_","gr55_","gr50_","gr72_","gr64_","gr55_","gr53_","gr50_","gr52_","gr51_","gr55_","gr52_","gr52_","gr55_","gr55_","gr69_","gr49_","gr53_","gr72_","gr27-","rc17_","rc18_","gr26_","gr51_","gr53_","gr54_","gr70_","gr50_","gr65_","gr56_","gr60_","gr53_","gr50_","gr49_","gr51_","gr54_","gr52_","gr53_","gr56_","gr53_","gr55_","gr69_","gr55_","gr68_","gr56_","gr55_","gr52_","gr51_","gr55_","gr60_","gr51_","gr53_","gr63_","gr49_","gr57_","gr49_","gr50_","gr70_","gr49_","gr50_","gr50_","gr50_","gr56_","gr63_","gr56_","gr54_","gr49_","gr52_","gr65_","gr53_","gr49_","gr55_","gr52_","gr51_","gr52_","gr52_","gr54_","gr51_","gr55_","gr49_","gr54_","gr54_","gr68_","gr50_","gr49_","gr51_","gr49_","gr71_","gr55_","gr50_","gr56_","gr49_","gr52_","gr72_","gr49_","gr49_","gr56_","gr54_","gr68_","gr49_","gr64_","gr49_","gr56_","gr56_","gr50_","gr60_","gr54_","gr50_","gr53_","gr49_","gr54_","gr54_","gr71_","gr52_","gr65_","gr55_","gr60_","gr49_","gr54_"],
|
||||||
|
["gr52_","gr54_","gr72_","gr53_","gr56_","gr72_","gr56_","gr63_","gr50_","gr57_","gr49_","gr52_","gr61_","gr55_","gr49_","gr51_","gr57_","gr50_","gr56_","gr54_","gr56_","gr53_","gr52_","gr51_","gr51_","gr56_","gr53_","gr68_","gr51_","gr49_","gr66_","gr56_","gr56_","gr62_","gr50_","gr56_","gr53_","gr60_","gr52_","gr50_","gr50_","gr52_","gr56_","gr49_","gr27-","rc17_","rc18_","gr24_","gr49_","gr50_","gr63_","gr51_","gr54_","gr54_","gr49_","gr53_","gr54_","gr51_","gr57_","gr52_","gr54_","gr54_","gr54_","gr55_","gr51_","gr55_","gr55_","gr55_","gr50_","gr50_","gr51_","gr51_","gr65_","gr55_","gr50_","gr68_","gr67_","gr50_","gr49_","gr49_","gr56_","gr52_","gr50_","gr53_","gr50_","gr72_","gr49_","gr52_","gr49_","gr71_","gr49_","gr50_","gr56_","gr53_","gr53_","gr51_","gr54_","gr66_","gr55_","gr52_","gr54_","gr65_","gr53_","gr49_","gr55_","gr52_","gr63_","gr52_","gr61_","gr54_","gr50_","gr69_","gr54_","gr55_","gr56_","gr52_","gr54_","gr52_","gr53_","gr56_","gr51_","gr53_","gr52_","gr52_","gr50_","gr53_","gr64_","gr53_","gr64_","gr53_","gr51_","gr70_","gr50_","gr66_","gr50_","gr52_","gr53_","gr50_","gr55_","gr49_","gr54_","gr51_","gr54_","gr61_"],
|
||||||
|
["gr52_","gr52_","gr49_","gr49_","gr49_","gr49_","gr52_","gr66_","gr53_","gr51_","gr50_","gr52_","gr51_","gr54_","gr54_","gr52_","gr49_","gr58_","gr50_","gr61_","gr52_","gr51_","gr59_","gr52_","gr50_","gr49_","gr51_","gr52_","gr55_","gr57_","gr54_","gr67_","gr49_","gr49_","gr53_","gr58_","gr51_","gr55_","gr71_","gr49_","gr54_","gr67_","gr51_","gr65_","gr26-","rc16_","rc18_","gr25_","gr50_","gr49_","gr52_","gr49_","gr70_","gr54_","gr55_","gr50_","gr55_","gr58_","gr58_","gr52_","gr54_","gr56_","gr49_","gr70_","gr53_","gr56_","gr61_","gr49_","gr69_","gr55_","gr60_","gr53_","gr53_","gr52_","gr63_","gr52_","gr50_","gr53_","gr51_","gr50_","gr58_","gr56_","gr49_","gr59_","gr55_","gr50_","gr70_","gr52_","gr50_","gr52_","gr52_","gr49_","gr53_","gr56_","gr55_","gr54_","gr56_","gr56_","gr72_","gr54_","gr53_","gr72_","gr53_","gr55_","gr53_","gr55_","gr55_","gr59_","gr49_","gr50_","gr51_","gr49_","gr56_","gr49_","gr50_","gr50_","gr56_","gr56_","gr49_","gr53_","gr53_","gr55_","gr49_","gr51_","gr68_","gr50_","gr56_","gr51_","gr67_","gr50_","gr54_","gr55_","gr53_","gr50_","gr49_","gr54_","gr51_","gr59_","gr58_","gr56_","gr54_","gr56_","gr54_","gr61_"],
|
||||||
|
["gr55_","gr51_","gr53_","gr54_","gr55_","gr54_","gr62_","gr50_","gr55_","gr51_","gr50_","gr50_","gr49_","gr53_","gr60_","gr62_","gr53_","gr52_","gr56_","gr54_","gr53_","gr53_","gr56_","gr49_","gr49_","gr55_","gr56_","gr58_","gr51_","gr56_","gr52_","gr54_","gr52_","gr70_","gr53_","gr63_","gr54_","gr54_","gr55_","gr68_","gr56_","gr56_","gr70_","gr55_","gr27-","rc17_","rc19_","gr24_","gr54_","gr56_","gr52_","gr50_","gr51_","gr50_","gr51_","gr51_","gr70_","gr54_","gr50_","gr65_","gr56_","gr65_","gr53_","gr53_","gr49_","gr50_","gr55_","gr54_","gr52_","gr55_","gr52_","gr52_","gr57_","gr55_","gr53_","gr49_","gr50_","gr54_","gr63_","gr51_","gr54_","gr53_","gr52_","gr67_","gr49_","gr55_","gr49_","gr49_","gr50_","gr61_","gr54_","gr62_","gr51_","gr51_","gr50_","gr72_","gr53_","gr56_","gr52_","gr50_","gr66_","gr50_","gr59_","gr49_","gr72_","gr55_","gr55_","gr56_","gr53_","gr53_","gr69_","gr53_","gr54_","gr51_","gr55_","gr50_","gr54_","gr54_","gr66_","gr53_","gr69_","gr54_","gr70_","gr56_","gr54_","gr54_","gr58_","gr49_","gr56_","gr55_","gr53_","gr51_","gr54_","gr69_","gr54_","gr52_","gr56_","gr65_","gr53_","gr53_","gr71_","gr53_","gr55_","gr53_"],
|
||||||
|
["gr60_","gr51_","gr54_","gr70_","gr50_","gr55_","gr54_","gr54_","gr56_","gr64_","gr50_","gr55_","gr56_","gr51_","gr53_","gr56_","gr51_","gr55_","gr65_","gr58_","gr50_","gr50_","gr52_","gr51_","gr62_","gr59_","gr69_","gr55_","gr49_","gr54_","gr60_","gr50_","gr51_","gr52_","gr55_","gr71_","gr54_","gr56_","gr62_","gr52_","gr66_","gr51_","gr72_","gr51_","gr25-","rc17_","rc18_","gr26_","gr52_","gr49_","gr56_","gr69_","gr53_","gr56_","gr53_","gr72_","gr51_","gr55_","gr50_","gr54_","gr58_","gr49_","gr52_","gr68_","gr64_","gr54_","gr52_","gr53_","gr56_","gr51_","gr49_","gr56_","gr51_","gr71_","gr50_","gr69_","gr50_","gr55_","gr53_","gr52_","gr53_","gr68_","gr51_","gr54_","gr64_","gr56_","gr49_","gr50_","gr56_","gr68_","gr49_","gr66_","gr58_","gr52_","gr55_","gr51_","gr52_","gr49_","gr69_","gr49_","gr50_","gr55_","gr55_","gr56_","gr51_","gr69_","gr55_","gr52_","gr51_","gr50_","gr54_","gr51_","gr55_","gr51_","gr57_","gr49_","gr52_","gr49_","gr50_","gr51_","gr55_","gr51_","gr50_","gr60_","gr71_","gr51_","gr52_","gr64_","gr51_","gr49_","gr56_","gr55_","gr51_","gr52_","gr56_","gr53_","gr53_","gr53_","gr51_","gr51_","gr49_","gr61_","gr53_","gr60_"],
|
||||||
|
["gr53_","gr53_","gr50_","gr56_","gr50_","gr50_","gr52_","gr54_","gr55_","gr66_","gr57_","gr50_","gr56_","gr56_","gr55_","gr50_","gr51_","gr52_","gr55_","gr56_","gr52_","gr59_","gr53_","gr49_","gr50_","gr52_","gr51_","gr49_","gr55_","gr68_","gr53_","gr54_","gr60_","gr51_","gr54_","gr49_","gr66_","gr53_","gr50_","gr56_","gr50_","gr67_","gr51_","gr54_","gr27-","rc17_","rc19_","gr25_","gr54_","gr51_","gr49_","gr51_","gr60_","gr50_","gr53_","gr50_","gr56_","gr69_","gr49_","gr56_","gr53_","gr56_","gr52_","gr68_","gr50_","gr59_","gr70_","gr55_","gr66_","gr50_","gr60_","gr55_","gr52_","gr53_","gr55_","gr55_","gr51_","gr56_","gr53_","gr53_","gr71_","gr51_","gr70_","gr51_","gr51_","gr51_","gr64_","gr56_","gr53_","gr56_","gr51_","gr52_","gr50_","gr54_","gr62_","gr55_","gr55_","gr52_","gr49_","gr50_","gr56_","gr63_","gr56_","gr51_","gr53_","gr56_","gr54_","gr70_","gr51_","gr55_","gr54_","gr60_","gr53_","gr50_","gr54_","gr50_","gr52_","gr53_","gr51_","gr50_","gr53_","gr60_","gr65_","gr69_","gr54_","gr55_","gr57_","gr52_","gr69_","gr54_","gr51_","gr49_","gr51_","gr56_","gr50_","gr61_","gr68_","gr53_","gr51_","gr51_","gr56_","gr52_","gr58_","gr51_"],
|
||||||
|
["gr56_","gr56_","gr66_","gr52_","gr71_","gr49_","gr64_","gr51_","gr54_","gr65_","gr49_","gr51_","gr49_","gr52_","gr59_","gr52_","gr55_","gr58_","gr56_","gr56_","gr59_","gr54_","gr52_","gr52_","gr53_","gr50_","gr55_","gr51_","gr54_","gr49_","gr65_","gr50_","gr64_","gr52_","gr65_","gr53_","gr51_","gr62_","gr52_","gr56_","gr49_","gr56_","gr53_","gr55_","gr25-","rc17_","rc19_","gr24_","gr50_","gr70_","gr52_","gr59_","gr56_","gr56_","gr50_","gr56_","gr51_","gr49_","gr49_","gr49_","gr49_","gr71_","gr54_","gr52_","gr54_","gr49_","gr51_","gr50_","gr55_","gr52_","gr52_","gr67_","gr51_","gr63_","gr52_","gr64_","gr53_","gr55_","gr70_","gr55_","gr60_","gr52_","gr52_","gr51_","gr51_","gr50_","gr68_","gr65_","gr49_","gr50_","gr53_","gr52_","gr50_","gr70_","gr55_","gr66_","gr52_","gr56_","gr64_","gr61_","gr51_","gr67_","gr56_","gr51_","gr53_","gr72_","gr54_","gr55_","gr64_","gr49_","gr59_","gr56_","gr49_","gr49_","gr54_","gr51_","gr65_","gr63_","gr51_","gr54_","gr54_","gr54_","gr55_","gr56_","gr52_","gr53_","gr50_","gr53_","gr50_","gr51_","gr50_","gr53_","gr49_","gr50_","gr53_","gr53_","gr64_","gr49_","gr71_","gr53_","gr69_","gr51_","gr56_","gr60_"],
|
||||||
|
["gr54_","gr52_","gr62_","gr51_","gr56_","gr51_","gr49_","gr52_","gr59_","gr54_","gr72_","gr59_","gr51_","gr56_","gr49_","gr55_","gr53_","gr49_","gr53_","gr50_","gr55_","gr53_","gr56_","gr51_","gr54_","gr54_","gr52_","gr50_","gr54_","gr54_","gr54_","gr55_","gr62_","gr54_","gr71_","gr51_","gr50_","gr50_","gr52_","gr53_","gr55_","gr50_","gr63_","gr54_","gr24-","rc17_","rc18_","gr26_","gr49_","gr51_","gr52_","gr53_","gr56_","gr72_","gr61_","gr50_","gr70_","gr50_","gr56_","gr56_","gr53_","gr53_","gr50_","gr60_","gr54_","gr57_","gr52_","gr56_","gr58_","gr49_","gr59_","gr51_","gr50_","gr55_","gr56_","gr71_","gr56_","gr54_","gr49_","gr49_","gr52_","gr55_","gr55_","gr53_","gr64_","gr53_","gr54_","gr63_","gr52_","gr56_","gr55_","gr51_","gr51_","gr54_","gr49_","gr54_","gr68_","gr53_","gr52_","gr59_","gr50_","gr50_","gr53_","gr71_","gr52_","gr54_","gr53_","gr49_","gr54_","gr54_","gr53_","gr56_","gr55_","gr56_","gr51_","gr62_","gr52_","gr49_","gr54_","gr49_","gr61_","gr53_","gr72_","gr49_","gr59_","gr53_","gr66_","gr63_","gr53_","gr55_","gr52_","gr50_","gr53_","gr49_","gr52_","gr50_","gr58_","gr55_","gr49_","gr54_","gr54_","gr50_","gr56_","gr55_"],
|
||||||
|
["gr55_","gr50_","gr53_","gr52_","gr54_","gr49_","gr56_","gr49_","gr55_","gr56_","gr56_","gr49_","gr53_","gr67_","gr49_","gr66_","gr55_","gr49_","gr54_","gr55_","gr56_","gr56_","gr51_","gr54_","gr71_","gr63_","gr49_","gr64_","gr55_","gr50_","gr53_","gr52_","gr56_","gr49_","gr49_","gr52_","gr52_","gr65_","gr66_","gr54_","gr52_","gr50_","gr49_","gr52_","gr25-","rc17_","rc19_","gr26_","gr51_","gr49_","gr56_","gr49_","gr53_","gr68_","gr54_","gr49_","gr55_","gr49_","gr71_","gr53_","gr51_","gr59_","gr56_","gr52_","gr56_","gr50_","gr49_","gr56_","gr50_","gr50_","gr55_","gr72_","gr55_","gr60_","gr53_","gr52_","gr52_","gr68_","gr54_","gr68_","gr54_","gr50_","gr61_","gr49_","gr50_","gr50_","gr69_","gr50_","gr54_","gr52_","gr49_","gr56_","gr53_","gr61_","gr54_","gr50_","gr55_","gr51_","gr51_","gr50_","gr54_","gr53_","gr56_","gr55_","gr50_","gr65_","gr52_","gr56_","gr35_","gr29|","gr28|","gr29|","gr28|","gr28|","gr30|","gr28|","gr28|","gr28|","gr29|","gr28|","gr31|","gr30|","gr30|","gr30|","gr28|","gr29|","gr31|","gr29|","gr31|","gr28|","gr28|","gr30|","gr29|","gr29|","gr28|","gr29|","gr31|","gr30|","gr29|","gr29|","gr29|","gr31|","gr30|","gr30|"],
|
||||||
|
["gr51_","gr49_","gr49_","gr55_","gr50_","gr66_","gr53_","gr50_","gr66_","gr55_","gr55_","gr53_","gr56_","gr53_","gr51_","gr54_","gr59_","gr51_","gr50_","gr62_","gr53_","gr53_","gr51_","gr61_","gr54_","gr53_","gr69_","gr52_","gr49_","gr69_","gr54_","gr49_","gr52_","gr54_","gr71_","gr55_","gr68_","gr67_","gr54_","gr59_","gr55_","gr70_","gr50_","gr72_","gr26-","rc16_","rc19_","gr26_","gr56_","gr57_","gr55_","gr72_","gr55_","gr52_","gr53_","gr68_","gr55_","gr53_","gr70_","gr49_","gr49_","gr55_","gr71_","gr53_","gr53_","gr60_","gr49_","gr51_","gr54_","gr54_","gr66_","gr56_","gr52_","gr55_","gr57_","gr55_","gr56_","gr50_","gr53_","gr54_","gr52_","gr63_","gr55_","gr55_","gr49_","gr67_","gr51_","gr56_","gr54_","gr62_","gr51_","gr51_","gr72_","gr51_","gr52_","gr55_","gr53_","gr51_","gr55_","gr53_","gr55_","gr66_","gr49_","gr51_","gr55_","gr49_","gr51_","gr52_","gr24-","rc9_","rc21_","rc21_","rc20_","rc21_","rc20_","rc20_","rc21_","rc21_","rc20_","rc20_","rc20_","rc21_","rc20_","rc20_","rc21_","rc20_","rc20_","rc21_","rc21_","rc20_","rc20_","rc21_","rc21_","rc20_","rc21_","rc21_","rc20_","rc20_","rc21_","rc21_","rc21_","rc21_","rc21_","rc20_"],
|
||||||
|
["gr50_","gr49_","gr56_","gr53_","gr58_","gr54_","gr56_","gr56_","gr52_","gr52_","gr61_","gr56_","gr52_","gr70_","gr54_","gr66_","gr50_","gr62_","gr51_","gr56_","gr55_","gr54_","gr49_","gr49_","gr68_","gr56_","gr49_","gr54_","gr51_","gr55_","gr65_","gr55_","gr60_","gr51_","gr49_","gr52_","gr49_","gr65_","gr55_","gr52_","gr50_","gr49_","gr52_","gr50_","gr26-","rc17_","rc18_","gr26_","gr55_","gr49_","gr50_","gr49_","gr70_","gr54_","gr50_","gr51_","gr53_","gr54_","gr53_","gr51_","gr72_","gr51_","gr49_","gr54_","gr53_","gr55_","gr54_","gr56_","gr55_","gr54_","gr50_","gr61_","gr55_","gr55_","gr69_","gr49_","gr54_","gr55_","gr54_","gr49_","gr52_","gr54_","gr52_","gr56_","gr68_","gr56_","gr54_","gr51_","gr54_","gr52_","gr52_","gr69_","gr52_","gr49_","gr52_","gr68_","gr53_","gr52_","gr54_","gr49_","gr69_","gr52_","gr55_","gr68_","gr51_","gr54_","gr50_","gr54_","gr27-","rc16_","rc3_","rc24_","rc22_","rc23_","rc27_","rc0_","rc25_","rc23_","rc22_","rc27_","rc5_","rc24_","rc23_","rc22_","rc27_","rc6_","rc25_","rc23_","rc22_","rc27_","rc5_","rc24_","rc23_","rc23_","rc27_","rc4_","rc24_","rc22_","rc22_","rc27_","rc2_","rc24_","rc22_","rc23_"],
|
||||||
|
["gr59_","gr50_","gr51_","gr53_","gr54_","gr62_","gr56_","gr58_","gr69_","gr54_","gr52_","gr49_","gr49_","gr55_","gr51_","gr70_","gr51_","gr50_","gr71_","gr52_","gr54_","gr51_","gr53_","gr49_","gr49_","gr49_","gr53_","gr55_","gr54_","gr57_","gr53_","gr52_","gr54_","gr51_","gr55_","gr51_","gr50_","gr50_","gr54_","gr50_","gr59_","gr56_","gr53_","gr58_","gr27-","rc16_","rc19_","gr26_","gr50_","gr51_","gr49_","gr53_","gr58_","gr52_","gr68_","gr55_","gr51_","gr52_","gr60_","gr51_","gr56_","gr55_","gr68_","gr64_","gr55_","gr52_","gr70_","gr55_","gr53_","gr65_","gr63_","gr55_","gr72_","gr52_","gr49_","gr65_","gr52_","gr67_","gr56_","gr53_","gr55_","gr53_","gr54_","gr51_","gr69_","gr71_","gr55_","gr50_","gr52_","gr57_","gr53_","gr61_","gr56_","gr62_","gr53_","gr49_","gr64_","gr55_","gr65_","gr56_","gr56_","gr56_","gr52_","gr49_","gr53_","gr49_","gr56_","gr54_","gr25-","rc17_","rc1_","rc18_","dt3_","dt3-","rc17_","rc5_","rc18_","dt1_","dt2-","rc17_","rc4_","rc19_","sa3_","sa12_","rc17_","rc3_","rc18_","sa4_","sa4_","rc17_","rc5_","rc19_","sa4_","sa0_","rc16_","rc1_","rc18_","sa7_","sa7_","rc17_","rc0_","rc18_","dt0_","dt10_"]]
|
144
test/testdata/ObjectPropertyTest/underground_terrain.json
vendored
Normal file
144
test/testdata/ObjectPropertyTest/underground_terrain.json
vendored
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
[["rc1_","rc7_","rc2_","rc7_","rc0_","rc7_","rc2_","rc5_","rc0_","rc7_","rc0_","rc4_","rc7_","rc1_","rc1_","rc2_","rc0_","rc6_","rc3_","rc7_","rc7_","rc2_","rc4_","rc7_","rc4_","rc5_","rc3_","rc2_","rc7_","rc1_","rc5_","rc0_","rc3_","rc0_","rc2_","rc0_","rc6_","rc6_","rc1_","rc2_","rc7_","rc0_","rc1_","rc4_","rc1_","rc3_","rc2_","rc2_","rc7_","rc7_","rc3_","rc2_","rc0_","rc5_","rc5_","rc7_","rc6_","rc7_","rc0_","rc4_","rc1_","rc0_","rc5_","rc3_","rc1_","rc4_","rc3_","rc6_","rc4_","rc1_","rc6_","rc6_","rc5_","rc5_","rc5_","rc2_","rc6_","rc1_","rc3_","rc3_","rc7_","rc7_","rc0_","rc5_","rc7_","rc1_","rc0_","rc0_","rc2_","rc2_","rc5_","rc0_","rc3_","rc0_","rc1_","rc2_","rc4_","rc2_","rc6_","rc1_","rc4_","rc6_","rc1_","rc7_","rc1_","rc7_","rc4_","rc7_","rc7_","rc5_","rc4_","rc3_","rc7_","rc5_","rc2_","rc1_","rc3_","rc3_","rc5_","rc4_","rc0_","rc5_","rc0_","rc0_","rc5_","rc2_","rc0_","rc5_","rc4_","rc2_","rc2_","rc0_","rc6_","rc7_","rc2_","rc7_","rc4_","rc5_","rc6_","rc3_","rc3_","rc6_","rc4_","rc3_"],
|
||||||
|
["rc7_","rc2_","rc1_","rc6_","rc4_","rc5_","rc5_","rc1_","rc1_","rc0_","rc3_","rc2_","rc6_","rc5_","rc4_","rc4_","rc7_","rc5_","rc6_","rc5_","rc2_","rc4_","rc1_","rc4_","rc5_","rc0_","rc3_","rc6_","rc3_","rc5_","rc5_","rc3_","rc1_","rc5_","rc6_","rc4_","rc3_","rc6_","rc6_","rc0_","rc5_","rc4_","rc5_","rc0_","rc7_","rc1_","rc4_","rc7_","rc0_","rc2_","rc4_","rc6_","rc6_","rc4_","rc7_","rc7_","rc5_","rc6_","rc4_","rc0_","rc7_","rc1_","rc6_","rc2_","rc3_","rc6_","rc7_","rc3_","rc0_","rc6_","rc1_","rc1_","rc3_","rc0_","rc6_","rc0_","rc7_","rc6_","rc0_","rc5_","rc5_","rc1_","rc3_","rc4_","rc5_","rc7_","rc2_","rc7_","rc4_","rc1_","rc7_","rc0_","rc6_","rc2_","rc7_","rc1_","rc5_","rc5_","rc5_","rc2_","rc2_","rc6_","rc6_","rc3_","rc4_","rc4_","rc5_","rc3_","rc7_","rc5_","rc0_","rc0_","rc7_","rc3_","rc3_","rc7_","rc5_","rc5_","rc3_","rc6_","rc1_","rc1_","rc5_","rc0_","rc0_","rc0_","rc0_","rc1_","rc0_","rc3_","rc1_","rc2_","rc2_","rc5_","rc6_","rc0_","rc7_","rc1_","rc4_","rc0_","rc7_","rc5_","rc4_","rc6_"],
|
||||||
|
["rc5_","rc6_","rc4_","rc6_","rc7_","rc7_","rc3_","rc2_","rc4_","rc4_","rc7_","rc6_","rc7_","rc4_","rc2_","rc0_","rc3_","rc7_","rc1_","rc3_","rc7_","rc3_","rc7_","rc6_","rc5_","rc5_","rc2_","rc1_","rc6_","rc7_","rc5_","rc0_","rc0_","rc5_","rc6_","rc3_","rc2_","rc4_","rc0_","rc4_","rc6_","rc4_","rc3_","rc3_","rc0_","rc5_","rc3_","rc6_","rc7_","rc1_","rc7_","rc5_","rc2_","rc1_","rc3_","rc6_","rc5_","rc3_","rc7_","rc4_","rc4_","rc1_","rc1_","rc5_","rc7_","rc5_","rc1_","rc4_","rc6_","rc4_","rc4_","rc4_","rc7_","rc1_","rc3_","rc6_","rc6_","rc4_","rc4_","rc5_","rc4_","rc2_","rc1_","rc0_","rc3_","rc6_","rc0_","rc0_","rc0_","rc0_","rc4_","rc2_","rc2_","rc5_","rc1_","rc7_","rc3_","rc0_","rc5_","rc2_","rc5_","rc0_","rc5_","rc2_","rc6_","rc1_","rc6_","rc1_","rc7_","rc7_","rc5_","rc4_","rc1_","rc1_","rc1_","rc3_","rc1_","rc2_","rc0_","rc3_","rc6_","rc6_","rc7_","rc3_","rc0_","rc3_","rc6_","rc4_","rc3_","rc5_","rc2_","rc5_","rc5_","rc7_","rc5_","rc5_","rc4_","rc6_","rc3_","rc2_","rc3_","rc0_","rc7_","rc2_"],
|
||||||
|
["rc7_","rc6_","rc6_","rc0_","rc5_","rc6_","rc1_","rc1_","rc6_","rc4_","rc1_","rc7_","rc5_","rc1_","rc6_","rc5_","rc1_","rc4_","rc1_","rc5_","rc6_","rc1_","rc3_","rc7_","rc1_","rc7_","rc4_","rc2_","rc3_","rc7_","rc0_","rc0_","rc5_","rc1_","rc0_","rc5_","rc6_","rc1_","rc5_","rc0_","rc1_","rc2_","rc2_","rc5_","rc2_","rc1_","rc3_","rc2_","rc2_","rc6_","rc0_","rc1_","rc1_","rc7_","rc6_","rc6_","rc4_","rc5_","rc0_","rc1_","rc7_","rc2_","rc2_","rc6_","rc4_","rc3_","rc6_","rc3_","rc5_","rc3_","rc3_","rc1_","rc6_","rc1_","rc3_","rc7_","rc7_","rc3_","rc3_","rc3_","rc0_","rc2_","rc0_","rc2_","rc6_","rc0_","rc0_","rc3_","rc5_","rc7_","rc7_","rc7_","rc6_","rc3_","rc3_","rc3_","rc4_","rc3_","rc2_","rc1_","rc1_","rc5_","rc3_","rc4_","rc6_","rc0_","rc2_","rc3_","rc3_","rc5_","rc0_","rc0_","rc3_","rc0_","rc2_","rc1_","rc4_","rc4_","rc0_","rc6_","rc5_","rc5_","rc1_","rc4_","rc1_","rc2_","rc5_","rc1_","rc4_","rc2_","rc3_","rc1_","rc3_","rc6_","rc5_","rc1_","rc0_","rc7_","rc1_","rc2_","rc6_","rc1_","rc1_","rc0_"],
|
||||||
|
["rc2_","rc1_","rc4_","rc4_","rc3_","rc3_","rc6_","rc6_","rc4_","rc0_","rc6_","rc7_","rc7_","rc5_","rc7_","rc6_","rc4_","rc7_","rc1_","rc1_","rc2_","rc6_","rc1_","rc7_","rc5_","rc7_","rc6_","rc4_","rc1_","rc7_","rc5_","rc4_","rc6_","rc4_","rc0_","rc3_","rc5_","rc6_","rc2_","rc5_","rc1_","rc6_","rc6_","rc1_","rc1_","rc6_","rc1_","rc3_","rc5_","rc2_","rc5_","rc3_","rc7_","rc5_","rc7_","rc0_","rc5_","rc7_","rc3_","rc0_","rc4_","rc5_","rc6_","rc4_","rc7_","rc1_","rc5_","rc0_","rc7_","rc4_","rc4_","rc1_","rc5_","rc1_","rc1_","rc2_","rc6_","rc4_","rc3_","rc0_","rc7_","rc3_","rc5_","rc4_","rc2_","rc4_","rc7_","rc2_","rc7_","rc7_","rc6_","rc0_","rc6_","rc5_","rc3_","rc0_","rc3_","rc1_","rc2_","rc1_","rc4_","rc6_","rc4_","rc3_","rc7_","rc1_","rc7_","rc2_","rc7_","rc0_","rc4_","rc5_","rc1_","rc3_","rc2_","rc7_","rc2_","rc2_","rc1_","rc6_","rc4_","rc0_","rc1_","rc2_","rc0_","rc6_","rc4_","rc0_","rc5_","rc3_","rc1_","rc7_","rc2_","rc2_","rc2_","rc3_","rc0_","rc5_","rc1_","rc1_","rc4_","rc1_","rc6_","rc2_"],
|
||||||
|
["rc4_","rc1_","rc4_","rc3_","rc0_","rc0_","rc5_","rc3_","rc3_","rc1_","rc3_","rc7_","rc1_","rc1_","rc1_","rc3_","rc3_","rc7_","rc1_","rc2_","rc1_","rc2_","rc7_","rc0_","rc0_","rc5_","rc5_","rc6_","rc4_","rc7_","rc0_","rc6_","rc7_","rc6_","rc4_","rc7_","rc3_","rc4_","rc4_","rc3_","rc4_","rc2_","rc4_","rc7_","rc2_","rc5_","rc2_","rc3_","rc6_","rc6_","rc2_","rc2_","rc2_","rc6_","rc1_","rc4_","rc6_","rc1_","rc5_","rc2_","rc0_","rc2_","rc3_","rc2_","rc3_","rc0_","rc0_","rc5_","rc4_","rc0_","rc4_","rc4_","rc1_","rc3_","rc4_","rc2_","rc2_","rc2_","rc7_","rc6_","rc5_","rc6_","rc4_","rc7_","rc5_","rc5_","rc2_","rc5_","rc2_","rc2_","rc7_","rc6_","rc7_","rc3_","rc5_","rc6_","rc0_","rc1_","rc2_","rc3_","rc2_","rc4_","rc6_","rc0_","rc0_","rc5_","rc3_","rc7_","rc3_","rc0_","rc0_","rc5_","rc1_","rc2_","rc7_","rc0_","rc1_","rc7_","rc0_","rc4_","rc6_","rc7_","rc5_","rc7_","rc2_","rc1_","rc7_","rc2_","rc5_","rc1_","rc0_","rc1_","rc6_","rc6_","rc3_","rc5_","rc1_","rc7_","rc1_","rc7_","rc2_","rc0_","rc6_","rc7_"],
|
||||||
|
["rc1_","rc7_","rc3_","rc7_","rc7_","rc4_","rc4_","rc1_","rc7_","rc0_","rc5_","rc0_","rc0_","rc5_","rc1_","rc6_","rc2_","rc6_","rc4_","rc1_","rc0_","rc0_","rc2_","rc3_","rc5_","rc2_","rc6_","rc3_","rc1_","rc1_","rc7_","rc6_","rc6_","rc7_","rc0_","rc2_","rc6_","rc5_","rc7_","rc4_","rc0_","rc6_","rc1_","rc0_","rc2_","rc5_","rc4_","rc1_","rc1_","rc2_","rc4_","rc2_","rc7_","rc2_","rc2_","rc4_","rc4_","rc5_","rc2_","rc0_","rc0_","rc3_","rc4_","rc0_","rc7_","rc1_","rc6_","rc2_","rc7_","rc0_","rc0_","rc5_","rc6_","rc0_","rc0_","rc6_","rc0_","rc3_","rc6_","rc4_","rc7_","rc4_","rc2_","rc3_","rc3_","rc2_","rc5_","rc6_","rc5_","rc0_","rc6_","rc1_","rc6_","rc7_","rc6_","rc6_","rc5_","rc5_","rc5_","rc6_","rc1_","rc0_","rc6_","rc3_","rc4_","rc6_","rc1_","rc3_","rc1_","rc7_","rc1_","rc7_","rc7_","rc5_","rc5_","rc5_","rc5_","rc2_","rc2_","rc3_","rc1_","rc3_","rc0_","rc5_","rc4_","rc4_","rc3_","rc0_","rc0_","rc4_","rc6_","rc0_","rc5_","rc2_","rc3_","rc7_","rc0_","rc0_","rc6_","rc7_","rc5_","rc7_","rc3_","rc2_"],
|
||||||
|
["rc7_","rc4_","rc5_","rc0_","rc5_","rc1_","rc0_","rc1_","rc7_","rc7_","rc1_","rc3_","rc1_","rc2_","rc5_","rc6_","rc7_","rc5_","rc7_","rc6_","rc3_","rc0_","rc6_","rc1_","rc2_","rc7_","rc6_","rc2_","rc5_","rc5_","rc6_","rc5_","rc7_","rc1_","rc2_","rc4_","rc3_","rc0_","rc1_","rc1_","rc0_","rc3_","rc2_","rc4_","rc6_","rc2_","rc2_","rc0_","rc3_","rc1_","rc2_","rc1_","rc2_","rc1_","rc7_","rc1_","rc4_","rc2_","rc1_","rc3_","rc1_","rc1_","rc0_","rc7_","rc0_","rc5_","rc4_","rc0_","rc5_","rc6_","rc4_","rc2_","rc3_","rc7_","rc1_","rc0_","rc3_","rc3_","rc4_","rc5_","rc3_","rc6_","rc5_","rc1_","rc2_","rc6_","rc6_","rc6_","rc3_","rc2_","rc7_","rc4_","rc1_","rc1_","rc3_","rc2_","rc2_","rc6_","rc3_","rc5_","rc6_","rc3_","rc1_","rc6_","rc1_","rc4_","rc0_","rc7_","rc7_","rc5_","rc2_","rc6_","rc0_","rc6_","rc2_","rc6_","rc5_","rc6_","rc3_","rc2_","rc1_","rc6_","rc0_","rc3_","rc3_","rc7_","rc6_","rc4_","rc4_","rc7_","rc7_","rc4_","rc4_","rc7_","rc0_","rc3_","rc2_","rc1_","rc5_","rc1_","rc3_","rc1_","rc4_","rc3_"],
|
||||||
|
["rc1_","rc0_","rc7_","rc0_","rc0_","rc1_","rc6_","rc3_","rc6_","rc6_","rc4_","rc1_","rc2_","rc2_","rc1_","rc6_","rc6_","rc5_","rc0_","rc3_","rc7_","rc3_","rc1_","rc2_","rc5_","rc6_","rc2_","rc5_","rc6_","rc5_","rc2_","rc4_","rc7_","rc5_","rc6_","rc6_","rc6_","rc7_","rc7_","rc2_","rc2_","rc2_","rc4_","rc6_","rc4_","rc3_","rc4_","rc0_","rc2_","rc2_","rc6_","rc2_","rc1_","rc6_","rc5_","rc3_","rc2_","rc4_","rc6_","rc4_","rc1_","rc4_","rc4_","rc1_","rc2_","rc4_","rc6_","rc1_","rc5_","rc1_","rc6_","rc7_","rc4_","rc3_","rc6_","rc2_","rc1_","rc1_","rc7_","rc1_","rc5_","rc5_","rc2_","rc3_","rc7_","rc1_","rc2_","rc6_","rc2_","rc1_","rc1_","rc6_","rc3_","rc3_","rc2_","rc1_","rc1_","rc5_","rc7_","rc1_","rc5_","rc6_","rc4_","rc2_","rc4_","rc0_","rc3_","rc4_","rc2_","rc4_","rc2_","rc2_","rc2_","rc6_","rc2_","rc4_","rc4_","rc2_","rc1_","rc3_","rc5_","rc0_","rc2_","rc3_","rc5_","rc4_","rc4_","rc6_","rc5_","rc1_","rc0_","rc6_","rc7_","rc7_","rc7_","rc2_","rc3_","rc1_","rc4_","rc5_","rc7_","rc4_","rc5_","rc4_"],
|
||||||
|
["rc7_","rc6_","rc7_","rc7_","rc5_","rc3_","rc2_","rc1_","rc3_","rc6_","rc3_","rc3_","rc6_","rc6_","rc2_","rc6_","rc5_","rc7_","rc3_","rc0_","rc3_","rc2_","rc0_","rc0_","rc1_","rc7_","rc7_","rc5_","rc7_","rc2_","rc0_","rc5_","rc4_","rc4_","rc2_","rc2_","rc5_","rc4_","rc6_","rc1_","rc2_","rc5_","rc3_","rc6_","rc7_","rc2_","rc4_","rc2_","rc2_","rc7_","rc7_","rc6_","rc0_","rc1_","rc0_","rc5_","rc5_","rc1_","rc6_","rc4_","rc3_","rc5_","rc3_","rc5_","rc2_","rc0_","rc1_","rc6_","rc2_","rc4_","rc3_","rc3_","rc5_","rc4_","rc2_","rc3_","rc0_","rc6_","rc2_","rc1_","rc3_","rc1_","rc5_","rc1_","rc7_","rc4_","rc5_","rc7_","rc0_","rc7_","rc7_","rc2_","rc3_","rc6_","rc6_","rc6_","rc1_","rc3_","rc6_","rc2_","rc4_","rc2_","rc3_","rc7_","rc2_","rc4_","rc1_","rc3_","rc0_","rc4_","rc5_","rc5_","rc1_","rc6_","rc3_","rc1_","rc7_","rc1_","rc1_","rc6_","rc1_","rc2_","rc4_","rc7_","rc5_","rc3_","rc2_","rc7_","rc0_","rc4_","rc0_","rc0_","rc4_","rc1_","rc5_","rc5_","rc1_","rc3_","rc6_","rc6_","rc0_","rc4_","rc3_","rc4_"],
|
||||||
|
["rc3_","rc5_","rc2_","rc6_","rc1_","rc2_","rc3_","rc4_","rc1_","rc1_","rc4_","rc2_","rc4_","rc6_","rc5_","rc7_","rc0_","rc3_","rc6_","rc6_","rc2_","rc6_","rc0_","rc4_","rc4_","rc3_","rc2_","rc4_","rc7_","rc4_","rc5_","rc7_","rc2_","rc6_","rc2_","rc0_","rc4_","rc6_","rc2_","rc7_","rc7_","rc4_","rc6_","rc4_","rc6_","rc7_","rc1_","rc7_","rc0_","rc1_","rc2_","rc5_","rc5_","rc3_","rc6_","rc6_","rc0_","rc4_","rc5_","rc4_","rc6_","rc6_","rc4_","rc6_","rc6_","rc2_","rc3_","rc6_","rc1_","rc6_","rc0_","rc0_","rc4_","rc4_","rc4_","rc5_","rc4_","rc4_","rc4_","rc7_","rc1_","rc4_","rc3_","rc5_","rc6_","rc0_","rc6_","rc1_","rc0_","rc5_","rc0_","rc0_","rc4_","rc2_","rc7_","rc1_","rc6_","rc0_","rc6_","rc2_","rc0_","rc1_","rc4_","rc7_","rc0_","rc0_","rc5_","rc5_","rc5_","rc7_","rc0_","rc6_","rc3_","rc7_","rc1_","rc6_","rc4_","rc3_","rc0_","rc5_","rc1_","rc6_","rc1_","rc6_","rc2_","rc6_","rc5_","rc0_","rc3_","rc1_","rc1_","rc2_","rc0_","rc7_","rc6_","rc4_","rc2_","rc0_","rc1_","rc3_","rc2_","rc0_","rc3_","rc6_"],
|
||||||
|
["rc5_","rc7_","rc4_","rc7_","rc0_","rc6_","rc4_","rc4_","rc6_","rc7_","rc2_","rc7_","rc0_","rc4_","rc0_","rc2_","rc4_","rc3_","rc6_","rc7_","rc2_","rc1_","rc6_","rc7_","rc2_","rc4_","rc0_","rc1_","rc2_","rc5_","rc7_","rc5_","rc7_","rc6_","rc4_","rc2_","rc1_","rc0_","rc2_","rc5_","rc5_","rc1_","rc1_","rc3_","rc5_","rc3_","rc7_","rc0_","rc2_","rc0_","rc3_","rc1_","rc5_","rc5_","rc4_","rc7_","rc2_","rc5_","rc2_","rc5_","rc6_","rc0_","rc3_","rc4_","rc2_","rc3_","rc1_","rc5_","rc0_","rc2_","rc2_","rc7_","rc6_","rc3_","rc0_","rc1_","rc2_","rc4_","rc1_","rc2_","rc4_","rc0_","rc2_","rc7_","rc2_","rc6_","rc0_","rc5_","rc7_","rc2_","rc7_","rc0_","rc5_","rc0_","rc7_","rc3_","rc6_","rc7_","rc3_","rc1_","rc5_","rc2_","rc4_","rc3_","rc2_","rc5_","rc6_","rc3_","rc6_","rc6_","rc0_","rc0_","rc3_","rc1_","rc2_","rc3_","rc0_","rc1_","rc2_","rc1_","rc4_","rc4_","rc0_","rc2_","rc0_","rc6_","rc3_","rc2_","rc2_","rc0_","rc3_","rc6_","rc7_","rc2_","rc0_","rc1_","rc1_","rc7_","rc2_","rc7_","rc1_","rc1_","rc3_","rc2_"],
|
||||||
|
["rc7_","rc5_","rc3_","rc3_","rc0_","rc0_","rc2_","rc3_","rc7_","rc1_","rc3_","rc2_","rc7_","rc1_","rc7_","rc1_","rc7_","rc0_","rc7_","rc3_","rc7_","rc2_","rc6_","rc1_","rc2_","rc2_","rc6_","rc6_","rc5_","rc6_","rc2_","rc7_","rc7_","rc3_","rc4_","rc0_","rc1_","rc2_","rc1_","rc3_","rc0_","rc3_","rc1_","rc2_","rc1_","rc1_","rc3_","rc7_","rc4_","rc7_","rc0_","rc2_","rc4_","rc1_","rc7_","rc2_","rc6_","rc5_","rc1_","rc0_","rc0_","rc3_","rc5_","rc1_","rc4_","rc4_","rc7_","rc2_","rc4_","rc7_","rc5_","rc0_","rc0_","rc2_","rc3_","rc0_","rc7_","rc6_","rc7_","rc5_","rc2_","rc3_","rc7_","rc1_","rc7_","rc7_","rc1_","rc6_","rc4_","rc1_","rc3_","rc4_","rc2_","rc3_","rc4_","rc6_","rc5_","rc7_","rc3_","rc0_","rc1_","rc0_","rc7_","rc4_","rc7_","rc4_","rc7_","rc5_","rc0_","rc1_","rc3_","rc3_","rc1_","rc6_","rc2_","rc1_","rc7_","rc4_","rc5_","rc3_","rc5_","rc5_","rc4_","rc4_","rc4_","rc3_","rc0_","rc7_","rc3_","rc4_","rc0_","rc4_","rc7_","rc4_","rc0_","rc5_","rc4_","rc3_","rc7_","rc1_","rc5_","rc1_","rc7_","rc1_"],
|
||||||
|
["rc0_","rc0_","rc3_","rc2_","rc5_","rc1_","rc4_","rc2_","rc1_","rc1_","rc4_","rc6_","rc6_","rc5_","rc7_","rc3_","rc5_","rc3_","rc6_","rc4_","rc7_","rc3_","rc6_","rc4_","rc0_","rc7_","rc1_","rc4_","rc5_","rc7_","rc4_","rc7_","rc7_","rc7_","rc0_","rc3_","rc1_","rc5_","rc4_","rc3_","rc7_","rc5_","rc3_","rc3_","rc7_","rc0_","rc2_","rc4_","rc4_","rc5_","rc5_","rc1_","rc0_","rc6_","rc3_","rc1_","rc2_","rc6_","rc7_","rc5_","rc1_","rc1_","rc0_","rc4_","rc0_","rc5_","rc3_","rc6_","rc2_","rc0_","rc7_","rc6_","rc7_","rc2_","rc1_","rc3_","rc0_","rc4_","rc2_","rc0_","rc7_","rc1_","rc6_","rc3_","rc3_","rc4_","rc6_","rc3_","rc3_","rc2_","rc0_","rc6_","rc0_","rc1_","rc4_","rc1_","rc0_","rc2_","rc3_","rc1_","rc0_","rc3_","rc4_","rc2_","rc2_","rc7_","rc7_","rc6_","rc0_","rc2_","rc5_","rc0_","rc7_","rc0_","rc7_","rc2_","rc7_","rc5_","rc6_","rc3_","rc2_","rc2_","rc3_","rc5_","rc3_","rc7_","rc1_","rc6_","rc2_","rc4_","rc7_","rc5_","rc5_","rc5_","rc2_","rc0_","rc0_","rc5_","rc3_","rc4_","rc0_","rc1_","rc5_","rc4_"],
|
||||||
|
["rc4_","rc0_","rc1_","rc5_","rc5_","rc2_","rc5_","rc2_","rc0_","rc7_","rc2_","rc3_","rc2_","rc1_","rc5_","rc3_","rc4_","rc5_","rc1_","rc2_","rc6_","rc6_","rc3_","rc0_","rc0_","rc2_","rc6_","rc4_","rc7_","rc1_","rc0_","rc4_","rc5_","rc3_","rc5_","rc5_","rc5_","rc2_","rc2_","rc6_","rc5_","rc0_","rc4_","rc0_","rc4_","rc1_","rc2_","rc0_","rc6_","rc4_","rc0_","rc0_","rc6_","rc6_","rc6_","rc2_","rc3_","rc0_","rc1_","rc7_","rc6_","rc3_","rc0_","rc0_","rc3_","rc1_","rc1_","rc3_","rc6_","rc5_","rc5_","rc7_","rc0_","rc5_","rc1_","rc3_","rc2_","rc7_","rc7_","rc4_","rc1_","rc2_","rc4_","rc6_","rc3_","rc6_","rc3_","rc6_","rc1_","rc7_","rc2_","rc5_","rc5_","rc6_","rc4_","rc7_","rc5_","rc0_","rc7_","rc4_","rc1_","rc3_","rc6_","rc7_","rc2_","rc7_","rc1_","rc6_","rc3_","rc1_","rc3_","rc1_","rc5_","rc6_","rc5_","rc6_","rc5_","rc5_","rc2_","rc3_","rc0_","rc5_","rc3_","rc6_","rc3_","rc2_","rc3_","rc2_","rc4_","rc2_","rc5_","rc3_","rc5_","rc5_","rc5_","rc4_","rc2_","rc4_","rc4_","rc7_","rc0_","rc1_","rc0_","rc5_"],
|
||||||
|
["rc1_","rc0_","rc3_","rc6_","rc5_","rc4_","rc3_","rc3_","rc3_","rc4_","rc2_","rc2_","rc0_","rc7_","rc7_","rc1_","rc7_","rc7_","rc5_","rc7_","rc3_","rc2_","rc2_","rc0_","rc1_","rc6_","rc2_","rc7_","rc1_","rc6_","rc5_","rc1_","rc5_","rc0_","rc7_","rc7_","rc3_","rc2_","rc6_","rc4_","rc0_","rc4_","rc1_","rc0_","rc6_","rc6_","rc7_","rc4_","rc7_","rc5_","rc6_","rc7_","rc2_","rc3_","rc5_","rc1_","rc6_","rc5_","rc4_","rc6_","rc5_","rc1_","rc2_","rc5_","rc3_","rc7_","rc7_","rc1_","rc6_","rc7_","rc3_","rc7_","rc0_","rc3_","rc7_","rc1_","rc2_","rc7_","rc3_","rc3_","rc4_","rc6_","rc7_","rc4_","rc3_","rc6_","rc6_","rc0_","rc2_","rc0_","rc0_","rc3_","rc4_","rc1_","rc7_","rc0_","rc0_","rc4_","rc4_","rc3_","rc6_","rc3_","rc3_","rc4_","rc2_","rc3_","rc4_","rc5_","rc7_","rc0_","rc3_","rc5_","rc5_","rc1_","rc2_","rc6_","rc5_","rc6_","rc6_","rc4_","rc4_","rc7_","rc7_","rc0_","rc7_","rc6_","rc4_","rc3_","rc7_","rc7_","rc6_","rc7_","rc5_","rc7_","rc4_","rc2_","rc7_","rc3_","rc0_","rc4_","rc3_","rc3_","rc7_","rc4_"],
|
||||||
|
["rc3_","rc7_","rc6_","rc5_","rc1_","rc0_","rc3_","rc7_","rc5_","rc2_","rc2_","rc3_","rc6_","rc0_","rc1_","rc7_","rc6_","rc1_","rc6_","rc3_","rc1_","rc2_","rc7_","rc3_","rc6_","rc4_","rc3_","rc6_","rc6_","rc7_","rc7_","rc6_","rc5_","rc7_","rc3_","rc1_","rc7_","rc6_","rc6_","rc7_","rc5_","rc2_","rc7_","rc5_","rc0_","rc0_","rc6_","rc2_","rc5_","rc1_","rc2_","rc0_","rc2_","rc4_","rc5_","rc5_","rc0_","rc5_","rc5_","rc2_","rc1_","rc4_","rc3_","rc4_","rc4_","rc1_","rc1_","rc1_","rc6_","rc7_","rc0_","rc5_","rc3_","rc6_","rc0_","rc6_","rc6_","rc5_","rc3_","rc4_","rc5_","rc7_","rc4_","rc6_","rc1_","rc6_","rc4_","rc1_","rc4_","rc6_","rc6_","rc2_","rc4_","rc3_","rc4_","rc5_","rc7_","rc5_","rc0_","rc7_","rc7_","rc3_","rc7_","rc1_","rc0_","rc6_","rc3_","rc6_","rc7_","rc0_","rc1_","rc7_","rc6_","rc4_","rc3_","rc4_","rc5_","rc7_","rc6_","rc7_","rc3_","rc7_","rc6_","rc4_","rc6_","rc3_","rc0_","rc3_","rc7_","rc4_","rc0_","rc1_","rc1_","rc3_","rc5_","rc3_","rc3_","rc3_","rc2_","rc4_","rc4_","rc7_","rc6_","rc2_"],
|
||||||
|
["rc7_","rc7_","rc6_","rc4_","rc7_","rc7_","rc1_","rc6_","rc5_","rc1_","rc5_","rc1_","rc7_","rc5_","rc0_","rc4_","rc3_","rc5_","rc1_","rc7_","rc5_","rc6_","rc0_","rc2_","rc5_","rc4_","rc4_","rc2_","rc5_","rc4_","rc4_","rc4_","rc1_","rc0_","rc7_","rc4_","rc7_","rc7_","rc7_","rc0_","rc1_","rc3_","rc3_","rc0_","rc1_","rc7_","rc5_","rc1_","rc4_","rc1_","rc4_","rc3_","rc2_","rc4_","rc2_","rc0_","rc6_","rc1_","rc0_","rc6_","rc1_","rc7_","rc1_","rc6_","rc3_","rc0_","rc5_","rc5_","rc4_","rc6_","rc7_","rc3_","rc0_","rc6_","rc0_","rc3_","rc2_","rc3_","rc5_","rc2_","rc2_","rc6_","rc7_","rc4_","rc1_","rc5_","rc2_","rc3_","rc5_","rc2_","rc0_","rc1_","rc0_","rc6_","rc7_","rc0_","rc6_","rc6_","rc0_","rc7_","rc7_","rc4_","rc1_","rc0_","rc1_","rc0_","rc5_","rc0_","rc2_","rc1_","rc2_","rc7_","rc4_","rc6_","rc3_","rc1_","rc2_","rc2_","rc0_","rc4_","rc2_","rc0_","rc3_","rc3_","rc4_","rc3_","rc4_","rc1_","rc1_","rc2_","rc0_","rc2_","rc7_","rc1_","rc4_","rc7_","rc5_","rc3_","rc0_","rc0_","rc2_","rc7_","rc2_","rc0_"],
|
||||||
|
["rc3_","rc1_","rc1_","rc3_","rc4_","rc2_","rc4_","rc3_","rc6_","rc2_","rc1_","rc3_","rc2_","rc5_","rc2_","rc3_","rc5_","rc4_","rc5_","rc6_","rc5_","rc6_","rc2_","rc0_","rc3_","rc7_","rc3_","rc3_","rc1_","rc7_","rc7_","rc4_","rc6_","rc5_","rc7_","rc2_","rc0_","rc6_","rc6_","rc7_","rc1_","rc1_","rc2_","rc3_","rc5_","rc5_","rc0_","rc4_","rc2_","rc5_","rc7_","rc2_","rc1_","rc3_","rc2_","rc2_","rc4_","rc2_","rc4_","rc1_","rc1_","rc0_","rc0_","rc4_","rc6_","rc4_","rc7_","rc6_","rc5_","rc5_","rc6_","rc2_","rc2_","rc4_","rc6_","rc1_","rc2_","rc2_","rc5_","rc5_","rc7_","rc4_","rc6_","rc7_","rc2_","rc6_","rc4_","rc7_","rc0_","rc6_","rc5_","rc2_","rc7_","rc3_","rc5_","rc0_","rc2_","rc6_","rc0_","rc6_","rc4_","rc7_","rc4_","rc2_","rc2_","rc3_","rc5_","rc6_","rc4_","rc4_","rc3_","rc6_","rc5_","rc2_","rc2_","rc5_","rc0_","rc1_","rc1_","rc5_","rc6_","rc2_","rc5_","rc5_","rc5_","rc7_","rc6_","rc0_","rc3_","rc1_","rc1_","rc4_","rc4_","rc4_","rc0_","rc0_","rc0_","rc6_","rc0_","rc2_","rc1_","rc4_","rc1_","rc7_"],
|
||||||
|
["rc3_","rc5_","rc3_","rc4_","rc4_","rc3_","rc7_","rc5_","rc6_","rc7_","rc3_","rc4_","rc3_","rc4_","rc3_","rc4_","rc1_","rc7_","rc4_","rc6_","rc6_","rc5_","rc2_","rc4_","rc5_","rc6_","rc5_","rc4_","rc1_","rc1_","rc7_","rc0_","rc2_","rc7_","rc1_","rc3_","rc6_","rc4_","rc7_","rc6_","rc2_","rc4_","rc1_","rc5_","rc1_","rc2_","rc4_","rc3_","rc3_","rc7_","rc0_","rc5_","rc1_","rc1_","rc2_","rc5_","rc1_","rc2_","rc5_","rc6_","rc6_","rc3_","rc5_","rc0_","rc1_","rc0_","rc5_","rc4_","rc5_","rc5_","rc1_","rc2_","rc7_","rc1_","rc6_","rc0_","rc5_","rc2_","rc1_","rc7_","rc2_","rc2_","rc5_","rc1_","rc7_","rc1_","rc1_","rc5_","rc3_","rc2_","rc1_","rc6_","rc5_","rc2_","rc3_","rc0_","rc1_","rc7_","rc5_","rc5_","rc2_","rc5_","rc6_","rc7_","rc0_","rc7_","rc2_","rc7_","rc2_","rc3_","rc2_","rc6_","rc5_","rc7_","rc3_","rc1_","rc5_","rc3_","rc5_","rc2_","rc3_","rc7_","rc7_","rc5_","rc0_","rc7_","rc1_","rc0_","rc2_","rc4_","rc3_","rc7_","rc5_","rc4_","rc4_","rc7_","rc3_","rc4_","rc5_","rc1_","rc6_","rc6_","rc7_","rc1_"],
|
||||||
|
["rc5_","rc6_","rc2_","rc7_","rc5_","rc1_","rc0_","rc5_","rc2_","rc0_","rc1_","rc3_","rc7_","rc1_","rc0_","rc0_","rc3_","rc7_","rc5_","rc2_","rc4_","rc3_","rc5_","rc0_","rc0_","rc3_","rc7_","rc5_","rc1_","rc2_","rc0_","rc7_","rc1_","rc7_","rc2_","rc1_","rc7_","rc3_","rc0_","rc6_","rc0_","rc5_","rc5_","rc0_","rc2_","rc0_","rc6_","rc0_","rc4_","rc1_","rc5_","rc6_","rc2_","rc1_","rc7_","rc2_","rc0_","rc1_","rc0_","rc4_","rc5_","rc7_","rc6_","rc2_","rc2_","rc3_","rc3_","rc0_","rc2_","rc7_","rc7_","rc5_","rc5_","rc7_","rc5_","rc3_","rc0_","rc5_","rc4_","rc7_","rc7_","rc0_","rc2_","rc2_","rc5_","rc6_","rc4_","rc7_","rc3_","rc0_","rc0_","rc6_","rc7_","rc5_","rc7_","rc0_","rc7_","rc1_","rc5_","rc4_","rc7_","rc7_","rc3_","rc2_","rc7_","rc5_","rc0_","rc6_","rc1_","rc7_","rc3_","rc6_","rc1_","rc7_","rc3_","rc7_","rc6_","rc3_","rc2_","rc6_","rc0_","rc7_","rc0_","rc3_","rc2_","rc5_","rc4_","rc2_","rc1_","rc2_","rc1_","rc5_","rc6_","rc3_","rc6_","rc4_","rc1_","rc7_","rc5_","rc7_","rc6_","rc7_","rc1_","rc5_"],
|
||||||
|
["rc5_","rc3_","rc2_","rc5_","rc4_","rc7_","rc3_","rc6_","rc7_","rc6_","rc6_","rc2_","rc3_","rc6_","rc6_","rc0_","rc0_","rc4_","rc5_","rc2_","rc6_","rc1_","rc7_","rc4_","rc1_","rc6_","rc6_","rc7_","rc7_","rc3_","rc0_","rc4_","rc0_","rc6_","rc6_","rc4_","rc0_","rc2_","rc6_","rc0_","rc2_","rc6_","rc3_","rc5_","rc5_","rc0_","rc3_","rc2_","rc3_","rc1_","rc2_","rc5_","rc7_","rc3_","rc6_","rc2_","rc7_","rc1_","rc2_","rc5_","rc3_","rc5_","rc6_","rc3_","rc5_","rc7_","rc7_","rc4_","rc1_","rc5_","rc3_","rc4_","rc7_","rc6_","rc0_","rc2_","rc6_","rc4_","rc5_","rc0_","rc3_","rc1_","rc1_","rc4_","rc2_","rc0_","rc3_","rc6_","rc4_","rc0_","rc1_","rc3_","rc3_","rc4_","rc5_","rc1_","rc2_","rc7_","rc5_","rc5_","rc0_","rc7_","rc2_","rc1_","rc6_","rc6_","rc3_","rc2_","rc6_","rc1_","rc3_","rc1_","rc7_","rc2_","rc0_","rc0_","rc7_","rc1_","rc6_","rc7_","rc0_","rc3_","rc3_","rc7_","rc6_","rc1_","rc4_","rc0_","rc7_","rc5_","rc0_","rc6_","rc4_","rc0_","rc3_","rc1_","rc0_","rc7_","rc6_","rc5_","rc6_","rc7_","rc5_","rc6_"],
|
||||||
|
["rc0_","rc6_","rc1_","rc0_","rc5_","rc5_","rc7_","rc7_","rc2_","rc3_","rc0_","rc3_","rc5_","rc3_","rc2_","rc6_","rc6_","rc1_","rc0_","rc0_","rc6_","rc0_","rc6_","rc2_","rc4_","rc0_","rc0_","rc2_","rc6_","rc6_","rc2_","rc7_","rc5_","rc5_","rc2_","rc6_","rc5_","rc4_","rc6_","rc4_","rc3_","rc7_","rc0_","rc5_","rc7_","rc2_","rc1_","rc4_","rc4_","rc3_","rc5_","rc3_","rc6_","rc0_","rc3_","rc5_","rc3_","rc1_","rc0_","rc3_","rc5_","rc7_","rc4_","rc4_","rc7_","rc5_","rc5_","rc0_","rc6_","rc6_","rc3_","rc7_","rc2_","rc0_","rc4_","rc5_","rc5_","rc7_","rc0_","rc2_","rc4_","rc4_","rc7_","rc7_","rc3_","rc7_","rc2_","rc2_","rc5_","rc3_","rc0_","rc6_","rc4_","rc1_","rc2_","rc5_","rc6_","rc0_","rc1_","rc0_","rc1_","rc4_","rc6_","rc0_","rc0_","rc4_","rc2_","rc5_","rc7_","rc1_","rc7_","rc7_","rc3_","rc3_","rc7_","rc4_","rc6_","rc5_","rc3_","rc1_","rc1_","rc5_","rc7_","rc4_","rc2_","rc5_","rc4_","rc1_","rc1_","rc5_","rc6_","rc4_","rc6_","rc5_","rc7_","rc7_","rc5_","rc5_","rc3_","rc4_","rc4_","rc0_","rc6_","rc4_"],
|
||||||
|
["rc4_","rc0_","rc3_","rc1_","rc6_","rc3_","rc7_","rc2_","rc0_","rc7_","rc5_","rc5_","rc0_","rc2_","rc2_","rc2_","rc1_","rc5_","rc4_","rc4_","rc4_","rc1_","rc7_","rc3_","rc0_","rc3_","rc0_","rc1_","rc5_","rc4_","rc5_","rc2_","rc5_","rc4_","rc4_","rc7_","rc4_","rc0_","rc4_","rc4_","rc1_","rc1_","rc2_","rc1_","rc6_","rc0_","rc4_","rc6_","rc5_","rc7_","rc3_","rc2_","rc3_","rc1_","rc4_","rc6_","rc2_","rc4_","rc7_","rc5_","rc1_","rc6_","rc5_","rc7_","rc6_","rc6_","rc3_","rc6_","rc7_","rc5_","rc4_","rc0_","rc5_","rc4_","rc6_","rc7_","rc3_","rc7_","rc3_","rc6_","rc6_","rc3_","rc3_","rc5_","rc4_","rc4_","rc0_","rc6_","rc2_","rc2_","rc2_","rc0_","rc1_","rc5_","rc4_","rc3_","rc0_","rc6_","rc7_","rc6_","rc0_","rc0_","rc5_","rc6_","rc4_","rc7_","rc1_","rc0_","rc7_","rc0_","rc5_","rc1_","rc3_","rc1_","rc4_","rc4_","rc7_","rc2_","rc1_","rc4_","rc0_","rc5_","rc7_","rc2_","rc4_","rc1_","rc3_","rc0_","rc3_","rc5_","rc7_","rc7_","rc7_","rc3_","rc1_","rc6_","rc5_","rc3_","rc3_","rc4_","rc3_","rc2_","rc3_","rc1_"],
|
||||||
|
["rc5_","rc2_","rc6_","rc0_","rc3_","rc4_","rc1_","rc7_","rc6_","rc3_","rc0_","rc2_","rc3_","rc3_","rc2_","rc5_","rc6_","rc2_","rc5_","rc0_","rc3_","rc6_","rc6_","rc0_","rc0_","rc7_","rc4_","rc3_","rc7_","rc5_","rc6_","rc4_","rc3_","rc5_","rc1_","rc1_","rc1_","rc1_","rc6_","rc1_","rc2_","rc6_","rc4_","rc1_","rc5_","rc2_","rc2_","rc1_","rc2_","rc5_","rc0_","rc3_","rc4_","rc7_","rc6_","rc3_","rc7_","rc3_","rc4_","rc5_","rc2_","rc2_","rc4_","rc3_","rc6_","rc3_","rc5_","rc6_","rc1_","rc1_","rc2_","rc0_","rc4_","rc5_","rc2_","rc0_","rc3_","rc6_","rc1_","rc5_","rc6_","rc7_","rc7_","rc6_","rc3_","rc0_","rc0_","rc1_","rc7_","rc7_","rc4_","rc2_","rc5_","rc0_","rc7_","rc6_","rc6_","rc2_","rc3_","rc1_","rc2_","rc5_","rc4_","rc5_","rc5_","rc1_","rc4_","rc5_","rc5_","rc0_","rc1_","rc1_","rc3_","rc7_","rc4_","rc2_","rc0_","rc0_","rc3_","rc0_","rc2_","rc4_","rc2_","rc1_","rc0_","rc7_","rc5_","rc5_","rc2_","rc5_","rc1_","rc0_","rc4_","rc4_","rc4_","rc0_","rc5_","rc1_","rc1_","rc0_","rc2_","rc7_","rc0_","rc4_"],
|
||||||
|
["rc0_","rc5_","rc6_","rc6_","rc3_","rc0_","rc1_","rc1_","rc0_","rc1_","rc7_","rc3_","rc2_","rc0_","rc0_","rc0_","rc3_","rc1_","rc0_","rc4_","rc0_","rc6_","rc2_","rc1_","rc3_","rc5_","rc1_","rc3_","rc3_","rc3_","rc0_","rc0_","rc6_","rc1_","rc5_","rc4_","rc2_","rc7_","rc1_","rc3_","rc1_","rc6_","rc4_","rc0_","rc3_","rc2_","rc6_","rc6_","rc0_","rc0_","rc1_","rc5_","rc6_","rc3_","rc5_","rc0_","rc7_","rc5_","rc4_","rc4_","rc7_","rc5_","rc0_","rc3_","rc5_","rc4_","rc1_","rc2_","rc0_","rc5_","rc3_","rc0_","rc4_","rc4_","rc7_","rc0_","rc4_","rc5_","rc1_","rc0_","rc2_","rc1_","rc3_","rc3_","rc5_","rc4_","rc0_","rc4_","rc3_","rc2_","rc2_","rc5_","rc7_","rc4_","rc0_","rc6_","rc4_","rc5_","rc2_","rc1_","rc3_","rc2_","rc7_","rc6_","rc1_","rc2_","rc2_","rc3_","rc5_","rc2_","rc0_","rc6_","rc0_","rc4_","rc5_","rc6_","rc6_","rc0_","rc0_","rc6_","rc4_","rc3_","rc4_","rc4_","rc3_","rc0_","rc0_","rc1_","rc4_","rc5_","rc0_","rc1_","rc3_","rc7_","rc5_","rc6_","rc1_","rc0_","rc4_","rc0_","rc5_","rc0_","rc3_","rc0_"],
|
||||||
|
["rc3_","rc1_","rc1_","rc5_","rc0_","rc0_","rc6_","rc6_","rc5_","rc1_","rc0_","rc1_","rc2_","rc2_","rc7_","rc4_","rc4_","rc3_","rc4_","rc2_","rc2_","rc3_","rc6_","rc0_","rc4_","rc7_","rc4_","rc0_","rc5_","rc7_","rc2_","rc6_","rc3_","rc1_","rc6_","rc1_","rc4_","rc3_","rc2_","rc4_","rc4_","rc3_","rc7_","rc6_","rc4_","rc0_","rc7_","rc7_","rc5_","rc7_","rc4_","rc4_","rc5_","rc7_","rc0_","rc4_","rc1_","rc6_","rc4_","rc3_","rc4_","rc7_","rc5_","rc7_","rc7_","rc4_","rc4_","rc2_","rc2_","rc1_","rc4_","rc0_","rc1_","rc1_","rc1_","rc1_","rc2_","rc5_","rc7_","rc1_","rc6_","rc1_","rc1_","rc6_","rc7_","rc1_","rc4_","rc2_","rc1_","rc5_","rc3_","rc1_","rc3_","rc1_","rc4_","rc5_","rc0_","rc0_","rc2_","rc0_","rc1_","rc2_","rc5_","rc1_","rc5_","rc3_","rc7_","rc4_","rc4_","rc6_","rc0_","rc3_","rc0_","rc2_","rc4_","rc1_","rc5_","rc3_","rc3_","rc1_","rc3_","rc4_","rc1_","rc2_","rc2_","rc4_","rc7_","rc6_","rc5_","rc7_","rc2_","rc3_","rc1_","rc7_","rc3_","rc1_","rc0_","rc2_","rc7_","rc5_","rc1_","rc5_","rc0_","rc5_"],
|
||||||
|
["rc3_","rc1_","rc3_","rc5_","rc2_","rc5_","rc3_","rc2_","rc0_","rc4_","rc6_","rc5_","rc0_","rc1_","rc6_","rc3_","rc7_","rc0_","rc3_","rc2_","rc3_","rc7_","rc7_","rc6_","rc1_","rc5_","rc3_","rc5_","rc2_","rc1_","rc0_","rc7_","rc6_","rc6_","rc0_","rc2_","rc4_","rc5_","rc5_","rc5_","rc7_","rc4_","rc2_","rc4_","rc5_","rc6_","rc2_","rc3_","rc5_","rc4_","rc5_","rc6_","rc7_","rc2_","rc2_","rc1_","rc1_","rc4_","rc1_","rc3_","rc6_","rc2_","rc0_","rc1_","rc1_","rc2_","rc1_","rc0_","rc3_","rc5_","rc2_","rc2_","rc2_","rc5_","rc5_","rc5_","rc2_","rc6_","rc1_","rc0_","rc0_","rc1_","rc1_","rc0_","rc4_","rc1_","rc3_","rc2_","rc7_","rc0_","rc3_","rc1_","rc6_","rc1_","rc1_","rc2_","rc6_","rc4_","rc0_","rc6_","rc0_","rc5_","rc1_","rc1_","rc6_","rc5_","rc0_","rc1_","rc7_","rc6_","rc4_","rc0_","rc7_","rc1_","rc5_","rc5_","rc3_","rc3_","rc1_","rc0_","rc4_","rc7_","rc0_","rc5_","rc2_","rc5_","rc1_","rc3_","rc2_","rc4_","rc4_","rc6_","rc3_","rc3_","rc1_","rc1_","rc5_","rc7_","rc1_","rc0_","rc3_","rc0_","rc4_","rc4_"],
|
||||||
|
["rc3_","rc4_","rc2_","rc0_","rc4_","rc0_","rc6_","rc4_","rc7_","rc4_","rc0_","rc0_","rc1_","rc6_","rc1_","rc4_","rc0_","rc2_","rc5_","rc6_","rc3_","rc1_","rc4_","rc3_","rc7_","rc0_","rc1_","rc1_","rc7_","rc3_","rc7_","rc4_","rc4_","rc1_","rc0_","rc0_","rc6_","rc0_","rc1_","rc7_","rc1_","rc4_","rc2_","rc2_","rc3_","rc5_","rc2_","rc5_","rc5_","rc7_","rc3_","rc7_","rc1_","rc7_","rc1_","rc7_","rc3_","rc2_","rc0_","rc5_","rc3_","rc7_","rc7_","rc0_","rc1_","rc0_","rc0_","rc4_","rc1_","rc4_","rc2_","rc7_","rc2_","rc1_","rc0_","rc3_","rc2_","rc1_","rc3_","rc6_","rc4_","rc2_","rc5_","rc0_","rc4_","rc3_","rc0_","rc5_","rc2_","rc4_","rc7_","rc5_","rc6_","rc5_","rc2_","rc0_","rc3_","rc1_","rc0_","rc5_","rc6_","rc4_","rc0_","rc4_","rc1_","rc2_","rc1_","rc3_","rc3_","rc2_","rc3_","rc6_","rc3_","rc4_","rc5_","rc3_","rc5_","rc7_","rc1_","rc5_","rc3_","rc6_","rc4_","rc7_","rc0_","rc3_","rc2_","rc3_","rc1_","rc5_","rc2_","rc3_","rc5_","rc6_","rc5_","rc0_","rc7_","rc0_","rc5_","rc1_","rc1_","rc1_","rc4_","rc7_"],
|
||||||
|
["rc2_","rc4_","rc2_","rc6_","rc3_","rc2_","rc4_","rc6_","rc7_","rc1_","rc1_","rc3_","rc2_","rc4_","rc6_","rc2_","rc4_","rc3_","rc4_","rc6_","rc5_","rc4_","rc0_","rc1_","rc3_","rc2_","rc4_","rc6_","rc1_","rc5_","rc5_","rc7_","rc3_","rc2_","rc5_","rc2_","rc7_","rc5_","rc1_","rc2_","rc6_","rc4_","rc5_","rc3_","rc4_","rc5_","rc6_","rc5_","rc3_","rc3_","rc0_","rc5_","rc7_","rc5_","rc2_","rc1_","rc6_","rc0_","rc7_","rc2_","rc6_","rc6_","rc6_","rc7_","rc3_","rc6_","rc4_","rc7_","rc1_","rc6_","rc0_","rc7_","rc7_","rc7_","rc7_","rc5_","rc5_","rc0_","rc2_","rc4_","rc7_","rc5_","rc5_","rc2_","rc2_","rc2_","rc1_","rc6_","rc7_","rc2_","rc4_","rc5_","rc6_","rc5_","rc7_","rc7_","rc5_","rc1_","rc0_","rc5_","rc0_","rc7_","rc1_","rc6_","rc3_","rc2_","rc1_","rc3_","rc6_","rc4_","rc2_","rc7_","rc0_","rc2_","rc3_","rc3_","rc7_","rc1_","rc6_","rc1_","rc7_","rc1_","rc4_","rc7_","rc1_","rc0_","rc0_","rc6_","rc6_","rc2_","rc1_","rc4_","rc5_","rc0_","rc4_","rc7_","rc1_","rc6_","rc2_","rc3_","rc6_","rc2_","rc6_","rc5_"],
|
||||||
|
["rc5_","rc2_","rc1_","rc1_","rc6_","rc4_","rc1_","rc1_","rc5_","rc4_","rc7_","rc7_","rc1_","rc2_","rc1_","rc6_","rc1_","rc2_","rc0_","rc3_","rc7_","rc0_","rc2_","rc1_","rc2_","rc3_","rc2_","rc6_","rc6_","rc1_","rc6_","rc0_","rc7_","rc3_","rc1_","rc4_","rc6_","rc3_","rc2_","rc0_","rc2_","rc3_","rc6_","rc7_","rc3_","rc0_","rc2_","rc5_","rc4_","rc7_","rc3_","rc3_","rc7_","rc7_","rc1_","rc6_","rc5_","rc7_","rc1_","rc3_","rc5_","rc1_","rc2_","rc6_","rc5_","rc7_","rc2_","rc3_","rc7_","rc4_","rc2_","rc4_","rc6_","rc7_","rc7_","rc5_","rc2_","rc4_","rc3_","rc4_","rc7_","rc3_","rc4_","rc4_","rc4_","rc5_","rc2_","rc4_","rc3_","rc4_","rc7_","rc4_","rc4_","rc2_","rc2_","rc0_","rc0_","rc5_","rc4_","rc0_","rc3_","rc1_","rc7_","rc6_","rc0_","rc7_","rc4_","rc2_","rc3_","rc5_","rc4_","rc3_","rc3_","rc6_","rc1_","rc6_","rc7_","rc3_","rc6_","rc4_","rc3_","rc1_","rc4_","rc7_","rc3_","rc5_","rc6_","rc5_","rc7_","rc6_","rc7_","rc1_","rc7_","rc2_","rc3_","rc6_","rc1_","rc3_","rc3_","rc5_","rc1_","rc3_","rc5_","rc1_"],
|
||||||
|
["rc0_","rc6_","rc4_","rc1_","rc0_","rc0_","rc3_","rc6_","rc6_","rc7_","rc0_","rc5_","rc1_","rc1_","rc7_","rc7_","rc3_","rc0_","rc3_","rc7_","rc6_","rc5_","rc4_","rc4_","rc0_","rc4_","rc6_","rc0_","rc2_","rc7_","rc7_","rc0_","rc5_","rc5_","rc3_","rc4_","rc6_","rc4_","rc3_","rc1_","rc4_","rc4_","rc3_","rc6_","rc7_","rc6_","rc3_","rc4_","rc3_","rc5_","rc1_","rc2_","rc5_","rc4_","rc4_","rc7_","rc6_","rc1_","rc4_","rc1_","rc6_","rc0_","rc0_","rc6_","rc3_","rc2_","rc0_","rc1_","rc1_","rc0_","rc5_","rc7_","rc4_","rc2_","rc5_","rc2_","rc4_","rc5_","rc3_","rc5_","rc0_","rc5_","rc7_","rc2_","rc7_","rc7_","rc2_","rc1_","rc2_","rc2_","rc5_","rc1_","rc6_","rc6_","rc2_","rc4_","rc1_","rc6_","rc2_","rc6_","rc3_","rc2_","rc0_","rc6_","rc7_","rc1_","rc7_","rc0_","rc1_","rc5_","rc0_","rc2_","rc2_","rc7_","rc6_","rc6_","rc2_","rc4_","rc6_","rc0_","rc5_","rc0_","rc0_","rc0_","rc2_","rc2_","rc3_","rc2_","rc0_","rc0_","rc1_","rc4_","rc1_","rc5_","rc6_","rc7_","rc4_","rc0_","rc7_","rc2_","rc5_","rc6_","rc0_","rc3_"],
|
||||||
|
["rc0_","rc3_","rc7_","rc0_","rc6_","rc5_","rc7_","rc5_","rc7_","rc1_","rc7_","rc6_","rc1_","rc3_","rc5_","rc7_","rc7_","rc0_","rc5_","rc3_","rc6_","rc6_","rc6_","rc2_","rc4_","rc7_","rc6_","rc6_","rc1_","rc1_","rc5_","rc0_","rc3_","rc1_","rc0_","rc6_","rc4_","rc1_","rc7_","rc0_","rc7_","rc0_","rc1_","rc3_","rc4_","rc1_","rc6_","rc5_","rc7_","rc7_","rc6_","rc2_","rc0_","rc7_","rc0_","rc7_","rc6_","rc6_","rc5_","rc5_","rc5_","rc5_","rc6_","rc0_","rc2_","rc2_","rc3_","rc1_","rc4_","rc1_","rc5_","rc0_","rc6_","rc2_","rc6_","rc6_","rc2_","rc5_","rc0_","rc2_","rc0_","rc3_","rc4_","rc2_","rc7_","rc7_","rc4_","rc5_","rc3_","rc6_","rc2_","rc7_","rc0_","rc2_","rc3_","rc4_","rc6_","rc5_","rc6_","rc0_","rc5_","rc4_","rc1_","rc7_","rc3_","rc1_","rc6_","rc0_","rc4_","rc6_","rc2_","rc7_","rc1_","rc7_","rc7_","rc4_","rc4_","rc7_","rc2_","rc6_","rc3_","rc5_","rc7_","rc3_","rc3_","rc1_","rc3_","rc4_","rc6_","rc2_","rc3_","rc5_","rc0_","rc2_","rc3_","rc3_","rc7_","rc4_","rc2_","rc1_","rc1_","rc4_","rc4_","rc4_"],
|
||||||
|
["rc3_","rc0_","rc7_","rc6_","rc7_","rc6_","rc2_","rc0_","rc5_","rc6_","rc3_","rc3_","rc5_","rc1_","rc0_","rc0_","rc3_","rc2_","rc1_","rc6_","rc4_","rc3_","rc4_","rc5_","rc1_","rc3_","rc0_","rc1_","rc2_","rc0_","rc6_","rc1_","rc5_","rc0_","rc4_","rc0_","rc7_","rc4_","rc4_","rc4_","rc1_","rc6_","rc6_","rc5_","rc7_","rc2_","rc1_","rc0_","rc5_","rc3_","rc7_","rc5_","rc2_","rc0_","rc2_","rc5_","rc2_","rc7_","rc1_","rc0_","rc7_","rc0_","rc0_","rc6_","rc0_","rc6_","rc7_","rc4_","rc4_","rc1_","rc1_","rc1_","rc1_","rc7_","rc7_","rc2_","rc0_","rc4_","rc6_","rc3_","rc3_","rc0_","rc7_","rc0_","rc2_","rc0_","rc6_","rc3_","rc2_","rc7_","rc5_","rc5_","rc7_","rc7_","rc2_","rc2_","rc3_","rc2_","rc6_","rc0_","rc0_","rc6_","rc7_","rc1_","rc2_","rc0_","rc0_","rc2_","rc1_","rc0_","rc7_","rc3_","rc6_","rc6_","rc0_","rc7_","rc3_","rc3_","rc0_","rc6_","rc0_","rc4_","rc5_","rc2_","rc3_","rc2_","rc4_","rc6_","rc7_","rc5_","rc2_","rc6_","rc1_","rc2_","rc7_","rc2_","rc7_","rc2_","rc0_","rc5_","rc1_","rc5_","rc4_","rc6_"],
|
||||||
|
["rc5_","rc7_","rc2_","rc4_","rc6_","rc2_","rc1_","rc7_","rc4_","rc4_","rc7_","rc5_","rc2_","rc3_","rc6_","rc2_","rc4_","rc6_","rc4_","rc4_","rc7_","rc5_","rc2_","rc6_","rc5_","rc4_","rc7_","rc2_","rc1_","rc4_","rc6_","rc5_","rc1_","rc2_","rc5_","rc5_","rc2_","rc4_","rc7_","rc6_","rc7_","rc1_","rc5_","rc6_","rc5_","rc1_","rc0_","rc6_","rc1_","rc5_","rc2_","rc2_","rc3_","rc0_","rc6_","rc3_","rc7_","rc6_","rc5_","rc3_","rc1_","rc3_","rc3_","rc7_","rc1_","rc0_","rc1_","rc4_","rc7_","rc1_","rc4_","rc3_","rc1_","rc3_","rc5_","rc7_","rc3_","rc4_","rc3_","rc2_","rc6_","rc3_","rc6_","rc2_","rc4_","rc2_","rc5_","rc1_","rc3_","rc0_","rc2_","rc6_","rc0_","rc4_","rc4_","rc6_","rc6_","rc7_","rc6_","rc7_","rc7_","rc2_","rc6_","rc6_","rc1_","rc0_","rc1_","rc7_","rc5_","rc5_","rc5_","rc5_","rc4_","rc7_","rc7_","rc3_","rc3_","rc3_","rc5_","rc2_","rc2_","rc3_","rc7_","rc4_","rc7_","rc7_","rc2_","rc0_","rc7_","rc2_","rc4_","rc7_","rc0_","rc6_","rc7_","rc7_","rc0_","rc2_","rc0_","rc5_","rc2_","rc3_","rc7_","rc0_"],
|
||||||
|
["rc3_","rc1_","rc4_","rc4_","rc0_","rc4_","rc0_","rc5_","rc3_","rc6_","rc2_","rc4_","rc5_","rc2_","rc3_","rc6_","rc5_","rc6_","rc4_","rc3_","rc2_","rc5_","rc6_","rc5_","rc6_","rc0_","rc2_","rc2_","rc3_","rc6_","rc2_","rc3_","rc3_","rc2_","rc7_","rc6_","rc2_","rc4_","rc5_","rc1_","rc6_","rc2_","rc4_","rc0_","rc3_","rc7_","rc1_","rc0_","rc0_","rc5_","rc4_","rc5_","rc6_","rc0_","rc3_","rc1_","rc2_","rc3_","rc6_","rc6_","rc0_","rc7_","rc4_","rc6_","rc2_","rc0_","rc7_","rc1_","rc2_","rc3_","rc4_","rc7_","rc5_","rc5_","rc6_","rc6_","rc0_","rc6_","rc2_","rc6_","rc7_","rc6_","rc5_","rc3_","rc3_","rc6_","rc5_","rc3_","rc4_","rc2_","rc6_","rc1_","rc0_","rc5_","rc7_","rc1_","rc3_","rc6_","rc4_","rc5_","rc7_","rc1_","rc5_","rc7_","rc5_","rc1_","rc6_","rc7_","rc5_","rc5_","rc0_","rc0_","rc3_","rc1_","rc0_","rc6_","rc3_","rc7_","rc6_","rc3_","rc5_","rc5_","rc1_","rc3_","rc4_","rc0_","rc2_","rc3_","rc4_","rc1_","rc6_","rc1_","rc2_","rc7_","rc7_","rc0_","rc1_","rc6_","rc5_","rc3_","rc2_","rc6_","rc1_","rc5_"],
|
||||||
|
["rc3_","rc7_","rc3_","rc6_","rc3_","rc3_","rc5_","rc1_","rc5_","rc4_","rc7_","rc3_","rc3_","rc1_","rc4_","rc6_","rc5_","rc3_","rc5_","rc7_","rc3_","rc4_","rc4_","rc4_","rc7_","rc2_","rc4_","rc2_","rc6_","rc1_","rc7_","rc6_","rc0_","rc7_","rc0_","rc3_","rc5_","rc3_","rc2_","rc4_","rc3_","rc0_","rc0_","rc2_","rc6_","rc7_","rc7_","rc0_","rc0_","rc3_","rc1_","rc5_","rc1_","rc1_","rc4_","rc1_","rc7_","rc7_","rc2_","rc4_","rc1_","rc4_","rc1_","rc3_","rc1_","rc1_","rc6_","rc5_","rc1_","rc6_","rc5_","rc5_","rc0_","rc0_","rc5_","rc0_","rc5_","rc2_","rc2_","rc2_","rc2_","rc2_","rc2_","rc4_","rc4_","rc5_","rc5_","rc0_","rc2_","rc5_","rc6_","rc0_","rc5_","rc1_","rc7_","rc4_","rc7_","rc6_","rc4_","rc3_","rc7_","rc5_","rc7_","rc4_","rc3_","rc5_","rc4_","rc5_","rc7_","rc2_","rc5_","rc4_","rc5_","rc6_","rc1_","rc3_","rc5_","rc0_","rc0_","rc1_","rc0_","rc2_","rc2_","rc7_","rc7_","rc7_","rc1_","rc1_","rc2_","rc5_","rc4_","rc6_","rc6_","rc7_","rc6_","rc1_","rc5_","rc6_","rc6_","rc1_","rc4_","rc0_","rc0_","rc5_"],
|
||||||
|
["rc1_","rc1_","rc4_","rc4_","rc4_","rc2_","rc5_","rc4_","rc0_","rc0_","rc5_","rc2_","rc2_","rc7_","rc7_","rc1_","rc1_","rc6_","rc5_","rc6_","rc6_","rc4_","rc3_","rc4_","rc6_","rc3_","rc3_","rc3_","rc5_","rc3_","rc3_","rc7_","rc6_","rc3_","rc4_","rc5_","rc0_","rc4_","rc4_","rc1_","rc3_","rc6_","rc7_","rc6_","rc4_","rc0_","rc1_","rc6_","rc5_","rc1_","rc7_","rc3_","rc0_","rc4_","rc6_","rc4_","rc5_","rc4_","rc4_","rc4_","rc2_","rc4_","rc6_","rc0_","rc3_","rc2_","rc2_","rc0_","rc2_","rc5_","rc6_","rc7_","rc0_","rc5_","rc0_","rc6_","rc5_","rc2_","rc7_","rc6_","rc5_","rc7_","rc2_","rc5_","rc4_","rc0_","rc0_","rc3_","rc2_","rc2_","rc7_","rc4_","rc2_","rc2_","rc1_","rc1_","rc0_","rc0_","rc4_","rc3_","rc2_","rc5_","rc1_","rc7_","rc0_","rc4_","rc0_","rc1_","rc6_","rc5_","rc1_","rc2_","rc2_","rc7_","rc6_","rc3_","rc1_","rc7_","rc7_","rc7_","rc7_","rc4_","rc6_","rc3_","rc6_","rc5_","rc4_","rc2_","rc6_","rc5_","rc4_","rc7_","rc6_","rc5_","rc7_","rc1_","rc3_","rc3_","rc7_","rc6_","rc7_","rc2_","rc0_","rc1_"],
|
||||||
|
["rc3_","rc2_","rc3_","rc6_","rc0_","rc1_","rc5_","rc1_","rc1_","rc2_","rc7_","rc1_","rc5_","rc5_","rc0_","rc2_","rc5_","rc7_","rc0_","rc3_","rc1_","rc4_","rc6_","rc5_","rc0_","rc2_","rc5_","rc6_","rc7_","rc0_","rc2_","rc5_","rc1_","rc7_","rc1_","rc6_","rc0_","rc7_","rc0_","rc0_","rc3_","rc5_","rc4_","rc6_","rc0_","rc3_","rc3_","rc3_","rc4_","rc0_","rc2_","rc1_","rc1_","rc2_","rc0_","rc3_","rc7_","rc2_","rc2_","rc1_","rc7_","rc7_","rc0_","rc4_","rc3_","rc6_","rc0_","rc3_","rc2_","rc0_","rc2_","rc6_","rc3_","rc3_","rc4_","rc1_","rc7_","rc6_","rc7_","rc3_","rc4_","rc0_","rc1_","rc7_","rc7_","rc0_","rc4_","rc2_","rc1_","rc2_","rc6_","rc7_","rc6_","rc0_","rc3_","rc7_","rc2_","rc7_","rc0_","rc5_","rc5_","rc4_","rc2_","rc1_","rc1_","rc7_","rc7_","rc3_","rc1_","rc6_","rc2_","rc3_","rc4_","rc5_","rc5_","rc6_","rc2_","rc5_","rc1_","rc4_","rc6_","rc2_","rc2_","rc7_","rc5_","rc2_","rc1_","rc6_","rc6_","rc3_","rc2_","rc3_","rc2_","rc4_","rc7_","rc2_","rc6_","rc6_","rc4_","rc4_","rc6_","rc4_","rc6_","rc3_"],
|
||||||
|
["rc5_","rc1_","rc5_","rc6_","rc3_","rc1_","rc1_","rc7_","rc5_","rc3_","rc4_","rc3_","rc3_","rc5_","rc4_","rc1_","rc6_","rc1_","rc4_","rc7_","rc1_","rc6_","rc3_","rc1_","rc1_","rc2_","rc5_","rc4_","rc0_","rc7_","rc1_","rc2_","rc6_","rc3_","rc3_","rc7_","rc1_","rc5_","rc3_","rc4_","rc7_","rc4_","rc6_","rc1_","rc1_","rc2_","rc2_","rc0_","rc3_","rc1_","rc0_","rc7_","rc1_","rc5_","rc5_","rc6_","rc4_","rc2_","rc1_","rc2_","rc4_","rc7_","rc5_","rc2_","rc0_","rc4_","rc6_","rc0_","rc5_","rc0_","rc7_","rc2_","rc4_","rc5_","rc6_","rc2_","rc7_","rc0_","rc5_","rc2_","rc4_","rc4_","rc4_","rc4_","rc2_","rc6_","rc5_","rc1_","rc4_","rc7_","rc0_","rc0_","rc5_","rc5_","rc1_","rc1_","rc3_","rc3_","rc6_","rc3_","rc6_","rc2_","rc5_","rc3_","rc3_","rc7_","rc6_","rc6_","rc4_","rc7_","rc4_","rc0_","rc2_","rc1_","rc2_","rc6_","rc6_","rc3_","rc3_","rc1_","rc3_","rc0_","rc3_","rc4_","rc1_","rc0_","rc4_","rc0_","rc6_","rc0_","rc3_","rc6_","rc5_","rc3_","rc5_","rc5_","rc4_","rc1_","rc4_","rc4_","rc0_","rc0_","rc7_","rc2_"],
|
||||||
|
["rc4_","rc0_","rc0_","rc4_","rc2_","rc3_","rc7_","rc7_","rc1_","rc5_","rc0_","rc7_","rc0_","rc0_","rc0_","rc7_","rc2_","rc3_","rc6_","rc2_","rc2_","rc4_","rc7_","rc1_","rc0_","rc3_","rc2_","rc6_","rc5_","rc1_","rc6_","rc0_","rc3_","rc2_","rc0_","rc0_","rc1_","rc7_","rc1_","rc3_","rc6_","rc6_","rc0_","rc1_","rc3_","rc5_","rc4_","rc6_","rc6_","rc5_","rc5_","rc7_","rc4_","rc4_","rc3_","rc7_","rc7_","rc6_","rc7_","rc2_","rc0_","rc5_","rc1_","rc2_","rc7_","rc6_","rc1_","rc0_","rc1_","rc5_","rc2_","rc5_","rc1_","rc4_","rc3_","rc2_","rc2_","rc0_","rc0_","rc5_","rc3_","rc5_","rc1_","rc4_","rc4_","rc3_","rc2_","rc7_","rc0_","rc1_","rc2_","rc1_","rc4_","rc1_","rc0_","rc7_","rc7_","rc4_","rc3_","rc5_","rc2_","rc7_","rc0_","rc5_","rc2_","rc6_","rc2_","rc1_","rc4_","rc0_","rc4_","rc3_","rc0_","rc3_","rc3_","rc3_","rc1_","rc2_","rc2_","rc1_","rc4_","rc4_","rc5_","rc3_","rc7_","rc7_","rc3_","rc1_","rc4_","rc4_","rc6_","rc7_","rc5_","rc5_","rc4_","rc3_","rc2_","rc4_","rc3_","rc7_","rc1_","rc6_","rc0_","rc1_"],
|
||||||
|
["rc6_","rc0_","rc1_","rc2_","rc4_","rc0_","rc4_","rc4_","rc2_","rc0_","rc7_","rc7_","rc1_","rc6_","rc2_","rc6_","rc5_","rc7_","rc2_","rc5_","rc2_","rc6_","rc7_","rc6_","rc1_","rc7_","rc7_","rc4_","rc3_","rc1_","rc4_","rc7_","rc5_","rc3_","rc4_","rc2_","rc4_","rc6_","rc1_","rc1_","rc3_","rc3_","rc0_","rc7_","rc3_","rc7_","rc5_","rc7_","rc3_","rc4_","rc7_","rc1_","rc0_","rc2_","rc7_","rc7_","rc6_","rc6_","rc7_","rc0_","rc7_","rc1_","rc1_","rc5_","rc4_","rc4_","rc5_","rc3_","rc2_","rc2_","rc7_","rc0_","rc6_","rc0_","rc0_","rc1_","rc5_","rc0_","rc4_","rc3_","rc5_","rc4_","rc5_","rc1_","rc0_","rc1_","rc6_","rc6_","rc2_","rc1_","rc2_","rc3_","rc0_","rc6_","rc5_","rc3_","rc3_","rc4_","rc3_","rc4_","rc6_","rc6_","rc0_","rc1_","rc4_","rc4_","rc7_","rc6_","rc6_","rc3_","rc0_","rc4_","rc4_","rc6_","rc4_","rc6_","rc1_","rc3_","rc2_","rc3_","rc4_","rc1_","rc7_","rc4_","rc4_","rc1_","rc1_","rc0_","rc3_","rc2_","rc5_","rc7_","rc7_","rc2_","rc2_","rc4_","rc5_","rc1_","rc6_","rc6_","rc6_","rc0_","rc7_","rc0_"],
|
||||||
|
["rc7_","rc2_","rc4_","rc0_","rc4_","rc1_","rc5_","rc5_","rc5_","rc5_","rc0_","rc5_","rc3_","rc1_","rc6_","rc5_","rc4_","rc6_","rc5_","rc2_","rc5_","rc4_","rc7_","rc0_","rc0_","rc6_","rc3_","rc1_","rc7_","rc5_","rc2_","rc0_","rc7_","rc0_","rc5_","rc7_","rc0_","rc3_","rc6_","rc5_","rc4_","rc5_","rc4_","rc4_","rc6_","rc6_","rc2_","rc2_","rc5_","rc1_","rc2_","rc6_","rc1_","rc6_","rc6_","rc6_","rc6_","rc3_","rc7_","rc7_","rc7_","rc4_","rc2_","rc4_","rc4_","rc1_","rc0_","rc2_","rc6_","rc7_","rc4_","rc4_","rc2_","rc2_","rc3_","rc2_","rc5_","rc1_","rc7_","rc7_","rc7_","rc2_","rc4_","rc3_","rc3_","rc7_","rc7_","rc6_","rc6_","rc1_","rc3_","rc7_","rc6_","rc5_","rc5_","rc4_","rc5_","rc4_","rc3_","rc2_","rc6_","rc7_","rc1_","rc0_","rc7_","rc2_","rc4_","rc7_","rc7_","rc1_","rc3_","rc4_","rc2_","rc1_","rc3_","rc1_","rc3_","rc0_","rc1_","rc0_","rc1_","rc7_","rc5_","rc2_","rc5_","rc6_","rc5_","rc0_","rc3_","rc1_","rc7_","rc0_","rc7_","rc2_","rc4_","rc1_","rc2_","rc0_","rc1_","rc2_","rc5_","rc6_","rc0_","rc0_"],
|
||||||
|
["rc5_","rc6_","rc7_","rc7_","rc7_","rc0_","rc6_","rc4_","rc6_","rc5_","rc7_","rc0_","rc3_","rc1_","rc1_","rc7_","rc5_","rc1_","rc5_","rc2_","rc1_","rc1_","rc5_","rc1_","rc3_","rc1_","rc1_","rc5_","rc6_","rc1_","rc5_","rc5_","rc0_","rc2_","rc0_","rc7_","rc2_","rc7_","rc5_","rc2_","rc6_","rc4_","rc7_","rc1_","rc2_","rc5_","rc1_","rc2_","rc4_","rc3_","rc4_","rc0_","rc6_","rc3_","rc4_","rc6_","rc4_","rc7_","rc5_","rc6_","rc3_","rc1_","rc1_","rc1_","rc4_","rc4_","rc6_","rc7_","rc2_","rc5_","rc6_","rc1_","rc1_","rc3_","rc7_","rc5_","rc7_","rc3_","rc4_","rc1_","rc7_","rc7_","rc3_","rc4_","rc3_","rc0_","rc1_","rc2_","rc2_","rc1_","rc3_","rc6_","rc3_","rc6_","rc6_","rc5_","rc1_","rc5_","rc1_","rc0_","rc7_","rc3_","rc1_","rc2_","rc6_","rc2_","rc5_","rc3_","rc4_","rc2_","rc4_","rc4_","rc7_","rc6_","rc4_","rc4_","rc3_","rc0_","rc4_","rc3_","rc0_","rc7_","rc4_","rc5_","rc7_","rc0_","rc3_","rc1_","rc6_","rc3_","rc1_","rc2_","rc3_","rc0_","rc7_","rc5_","rc5_","rc2_","rc3_","rc4_","rc1_","rc2_","rc0_","rc3_"],
|
||||||
|
["rc4_","rc7_","rc6_","rc1_","rc4_","rc4_","rc6_","rc2_","rc4_","rc2_","rc0_","rc2_","rc7_","rc0_","rc0_","rc4_","rc4_","rc0_","rc6_","rc4_","rc3_","rc5_","rc6_","rc2_","rc0_","rc2_","rc0_","rc0_","rc5_","rc4_","rc0_","rc5_","rc5_","rc2_","rc0_","rc3_","rc6_","rc3_","rc5_","rc6_","rc6_","rc1_","rc0_","rc7_","rc2_","rc5_","rc5_","rc0_","rc3_","rc4_","rc1_","rc0_","rc2_","rc0_","rc7_","rc0_","rc4_","rc2_","rc4_","rc7_","rc1_","rc6_","rc4_","rc4_","rc2_","rc7_","rc4_","rc2_","rc2_","rc6_","rc2_","rc1_","rc7_","rc5_","rc2_","rc2_","rc1_","rc0_","rc2_","rc3_","rc2_","rc6_","rc0_","rc4_","rc5_","rc3_","rc3_","rc1_","rc4_","rc2_","rc7_","rc1_","rc5_","rc3_","rc4_","rc6_","rc5_","rc7_","rc1_","rc6_","rc0_","rc3_","rc6_","rc1_","rc7_","rc4_","rc7_","rc4_","rc3_","rc0_","rc0_","rc6_","rc1_","rc6_","rc5_","rc1_","rc7_","rc6_","rc0_","rc3_","rc6_","rc3_","rc1_","rc5_","rc0_","rc0_","rc1_","rc4_","rc3_","rc1_","rc7_","rc6_","rc7_","rc4_","rc7_","rc7_","rc5_","rc0_","rc0_","rc5_","rc1_","rc5_","rc5_","rc1_"],
|
||||||
|
["rc1_","rc4_","rc6_","rc7_","rc6_","rc7_","rc0_","rc7_","rc2_","rc4_","rc2_","rc5_","rc2_","rc7_","rc1_","rc5_","rc7_","rc6_","rc6_","rc4_","rc0_","rc1_","rc7_","rc3_","rc2_","rc1_","rc4_","rc5_","rc2_","rc7_","rc2_","rc3_","rc2_","rc0_","rc5_","rc6_","rc2_","rc0_","rc1_","rc5_","rc1_","rc6_","rc2_","rc7_","rc5_","rc7_","rc5_","rc3_","rc7_","rc5_","rc7_","rc6_","rc2_","rc0_","rc4_","rc5_","rc5_","rc5_","rc2_","rc3_","rc7_","rc7_","rc7_","rc6_","rc3_","rc3_","rc1_","rc5_","rc4_","rc1_","rc5_","rc4_","rc3_","rc0_","rc1_","rc4_","rc6_","rc0_","rc6_","rc4_","rc3_","rc6_","rc0_","rc5_","rc6_","rc3_","rc0_","rc4_","rc7_","rc6_","rc4_","rc1_","rc7_","rc4_","rc5_","rc0_","rc5_","rc5_","rc1_","rc5_","rc4_","rc0_","rc2_","rc6_","rc7_","rc2_","rc7_","rc3_","rc0_","rc3_","rc2_","rc1_","rc4_","rc1_","rc2_","rc0_","rc3_","rc1_","rc1_","rc2_","rc7_","rc3_","rc1_","rc5_","rc4_","rc6_","rc2_","rc2_","rc7_","rc4_","rc7_","rc6_","rc1_","rc7_","rc2_","rc1_","rc6_","rc4_","rc5_","rc6_","rc0_","rc7_","rc3_","rc2_"],
|
||||||
|
["rc2_","rc7_","rc5_","rc1_","rc2_","rc3_","rc1_","rc5_","rc6_","rc5_","rc1_","rc0_","rc3_","rc6_","rc0_","rc4_","rc2_","rc2_","rc2_","rc0_","rc4_","rc5_","rc4_","rc6_","rc7_","rc7_","rc1_","rc3_","rc1_","rc4_","rc7_","rc7_","rc4_","rc7_","rc2_","rc6_","rc3_","rc0_","rc7_","rc6_","rc4_","rc3_","rc3_","rc2_","rc6_","rc3_","rc5_","rc5_","rc5_","rc6_","rc2_","rc3_","rc4_","rc3_","rc0_","rc5_","rc3_","rc2_","rc5_","rc4_","rc1_","rc3_","rc0_","rc0_","rc3_","rc1_","rc7_","rc0_","rc5_","rc0_","rc3_","rc5_","rc0_","rc5_","rc1_","rc2_","rc5_","rc5_","rc3_","rc7_","rc1_","rc1_","rc7_","rc7_","rc2_","rc0_","rc6_","rc6_","rc1_","rc5_","rc7_","rc7_","rc0_","rc3_","rc4_","rc4_","rc6_","rc6_","rc6_","rc7_","rc1_","rc4_","rc5_","rc1_","rc3_","rc3_","rc2_","rc2_","rc7_","rc5_","rc1_","rc0_","rc6_","rc2_","rc1_","rc3_","rc5_","rc4_","rc6_","rc0_","rc2_","rc1_","rc1_","rc4_","rc7_","rc4_","rc5_","rc4_","rc6_","rc5_","rc5_","rc3_","rc6_","rc2_","rc5_","rc4_","rc4_","rc6_","rc7_","rc0_","rc5_","rc2_","rc7_","rc1_"],
|
||||||
|
["rc3_","rc1_","rc0_","rc0_","rc6_","rc0_","rc0_","rc5_","rc6_","rc5_","rc1_","rc5_","rc6_","rc6_","rc2_","rc0_","rc2_","rc6_","rc6_","rc3_","rc5_","rc5_","rc3_","rc4_","rc4_","rc5_","rc6_","rc5_","rc7_","rc4_","rc4_","rc2_","rc1_","rc6_","rc4_","rc6_","rc5_","rc2_","rc4_","rc3_","rc4_","rc1_","rc1_","rc0_","rc4_","rc2_","rc3_","rc0_","rc3_","rc2_","rc0_","rc1_","rc5_","rc2_","rc7_","rc2_","rc2_","rc1_","rc0_","rc1_","rc4_","rc3_","rc2_","rc3_","rc7_","rc2_","rc5_","rc5_","rc1_","rc4_","rc2_","rc3_","rc4_","rc6_","rc0_","rc7_","rc2_","rc0_","rc0_","rc4_","rc1_","rc0_","rc2_","rc3_","rc7_","rc3_","rc1_","rc6_","rc7_","rc1_","rc5_","rc3_","rc4_","rc0_","rc0_","rc4_","rc6_","rc4_","rc4_","rc4_","rc3_","rc6_","rc2_","rc4_","rc7_","rc2_","rc6_","rc0_","rc7_","rc6_","rc1_","rc3_","rc3_","rc0_","rc6_","rc2_","rc2_","rc7_","rc2_","rc0_","rc2_","rc5_","rc6_","rc5_","rc0_","rc2_","rc6_","rc4_","rc5_","rc4_","rc7_","rc5_","rc2_","rc7_","rc5_","rc0_","rc5_","rc0_","rc2_","rc4_","rc4_","rc6_","rc6_","rc7_"],
|
||||||
|
["rc1_","rc2_","rc3_","rc6_","rc7_","rc6_","rc0_","rc7_","rc5_","rc5_","rc1_","rc5_","rc0_","rc2_","rc5_","rc4_","rc5_","rc3_","rc0_","rc6_","rc7_","rc7_","rc1_","rc5_","rc6_","rc5_","rc6_","rc2_","rc1_","rc7_","rc7_","rc6_","rc5_","rc7_","rc1_","rc7_","rc6_","rc1_","rc4_","rc4_","rc5_","rc2_","rc7_","rc4_","rc3_","rc7_","rc3_","rc4_","rc6_","rc0_","rc5_","rc0_","rc1_","rc6_","rc7_","rc5_","rc0_","rc3_","rc1_","rc4_","rc5_","rc1_","rc4_","rc1_","rc4_","rc6_","rc0_","rc4_","rc6_","rc7_","rc7_","rc7_","rc4_","rc3_","rc1_","rc2_","rc2_","rc1_","rc1_","rc4_","rc7_","rc3_","rc0_","rc3_","rc1_","rc5_","rc0_","rc6_","rc6_","rc1_","rc3_","rc0_","rc0_","rc5_","rc6_","rc7_","rc1_","rc0_","rc0_","rc6_","rc0_","rc0_","rc7_","rc0_","rc2_","rc0_","rc6_","rc7_","rc4_","rc0_","rc7_","rc4_","rc0_","rc5_","rc7_","rc7_","rc7_","rc3_","rc2_","rc0_","rc6_","rc0_","rc5_","rc7_","rc3_","rc2_","rc3_","rc2_","rc2_","rc4_","rc1_","rc5_","rc3_","rc5_","rc6_","rc7_","rc6_","rc1_","rc5_","rc2_","rc2_","rc5_","rc6_","rc3_"],
|
||||||
|
["rc2_","rc5_","rc4_","rc3_","rc2_","rc0_","rc7_","rc5_","rc0_","rc6_","rc5_","rc1_","rc6_","rc1_","rc4_","rc0_","rc7_","rc2_","rc4_","rc1_","rc0_","rc5_","rc3_","rc4_","rc1_","rc7_","rc0_","rc5_","rc4_","rc7_","rc4_","rc2_","rc5_","rc3_","rc6_","rc0_","rc2_","rc5_","rc6_","rc4_","rc6_","rc6_","rc4_","rc6_","rc0_","rc0_","rc2_","rc2_","rc1_","rc2_","rc7_","rc2_","rc6_","rc0_","rc5_","rc6_","rc3_","rc2_","rc6_","rc6_","rc1_","rc6_","rc2_","rc1_","rc0_","rc0_","rc4_","rc7_","rc1_","rc0_","rc7_","rc4_","rc5_","rc5_","rc2_","rc5_","rc2_","rc1_","rc3_","rc0_","rc0_","rc5_","rc3_","rc7_","rc6_","rc7_","rc6_","rc6_","rc3_","rc0_","rc7_","rc6_","rc2_","rc3_","rc1_","rc0_","rc4_","rc3_","rc0_","rc5_","rc4_","rc4_","rc1_","rc6_","rc0_","rc5_","rc0_","rc0_","rc4_","rc4_","rc1_","rc2_","rc3_","rc2_","rc1_","rc2_","rc0_","rc1_","rc5_","rc4_","rc1_","rc3_","rc3_","rc4_","rc6_","rc5_","rc0_","rc7_","rc1_","rc4_","rc1_","rc5_","rc6_","rc6_","rc6_","rc2_","rc4_","rc5_","rc4_","rc5_","rc5_","rc7_","rc2_","rc0_"],
|
||||||
|
["rc3_","rc1_","rc7_","rc1_","rc3_","rc6_","rc2_","rc0_","rc6_","rc2_","rc1_","rc2_","rc5_","rc4_","rc6_","rc5_","rc6_","rc3_","rc7_","rc6_","rc5_","rc0_","rc5_","rc0_","rc4_","rc5_","rc0_","rc5_","rc5_","rc4_","rc0_","rc1_","rc7_","rc3_","rc7_","rc5_","rc0_","rc6_","rc5_","rc2_","rc2_","rc6_","rc4_","rc6_","rc1_","rc1_","rc5_","rc4_","rc3_","rc1_","rc2_","rc7_","rc1_","rc1_","rc6_","rc7_","rc6_","rc6_","rc2_","rc0_","rc5_","rc2_","rc2_","rc6_","rc0_","rc7_","rc7_","rc6_","rc6_","rc2_","rc6_","rc1_","rc4_","rc6_","rc1_","rc2_","rc0_","rc2_","rc4_","rc2_","rc1_","rc5_","rc2_","rc1_","rc3_","rc2_","rc1_","rc0_","rc2_","rc7_","rc4_","rc5_","rc5_","rc2_","rc0_","rc7_","rc5_","rc5_","rc1_","rc3_","rc6_","rc1_","rc5_","rc6_","rc5_","rc2_","rc1_","rc4_","rc2_","rc2_","rc3_","rc0_","rc0_","rc0_","rc7_","rc4_","rc3_","rc2_","rc6_","rc4_","rc1_","rc0_","rc5_","rc6_","rc4_","rc3_","rc2_","rc4_","rc7_","rc6_","rc3_","rc6_","rc7_","rc4_","rc2_","rc1_","rc4_","rc2_","rc4_","rc5_","rc0_","rc6_","rc2_","rc6_"],
|
||||||
|
["rc7_","rc1_","rc2_","rc0_","rc0_","rc1_","rc6_","rc0_","rc3_","rc1_","rc4_","rc1_","rc3_","rc5_","rc0_","rc5_","rc6_","rc1_","rc7_","rc5_","rc2_","rc1_","rc5_","rc2_","rc2_","rc7_","rc2_","rc4_","rc2_","rc0_","rc1_","rc3_","rc7_","rc0_","rc1_","rc5_","rc2_","rc7_","rc7_","rc7_","rc7_","rc3_","rc3_","rc7_","rc1_","rc0_","rc2_","rc1_","rc1_","rc6_","rc4_","rc1_","rc6_","rc3_","rc7_","rc1_","rc7_","rc0_","rc4_","rc3_","rc7_","rc7_","rc0_","rc1_","rc0_","rc5_","rc5_","rc2_","rc3_","rc5_","rc2_","rc0_","rc6_","rc6_","rc1_","rc0_","rc7_","rc5_","rc0_","rc2_","rc0_","rc6_","rc2_","rc2_","rc4_","rc7_","rc6_","rc5_","rc2_","rc5_","rc0_","rc0_","rc7_","rc4_","rc7_","rc6_","rc0_","rc1_","rc7_","rc0_","rc1_","rc2_","rc7_","rc2_","rc7_","rc0_","rc6_","rc4_","rc5_","rc3_","rc2_","rc6_","rc5_","rc7_","rc1_","rc7_","rc4_","rc7_","rc3_","rc0_","rc3_","rc7_","rc0_","rc4_","rc4_","rc5_","rc6_","rc3_","rc2_","rc3_","rc5_","rc7_","rc4_","rc6_","rc7_","rc6_","rc3_","rc3_","rc2_","rc2_","rc2_","rc3_","rc0_","rc6_"],
|
||||||
|
["rc5_","rc4_","rc1_","rc2_","rc5_","rc2_","rc7_","rc0_","rc4_","rc5_","rc2_","rc7_","rc3_","rc5_","rc5_","rc0_","rc4_","rc3_","rc1_","rc7_","rc5_","rc2_","rc0_","rc4_","rc2_","rc6_","rc5_","rc3_","rc6_","rc4_","rc2_","rc1_","rc3_","rc2_","rc2_","rc1_","rc0_","rc0_","rc0_","rc6_","rc2_","rc7_","rc0_","rc1_","rc7_","rc1_","rc4_","rc4_","rc7_","rc2_","rc1_","rc0_","rc3_","rc5_","rc4_","rc4_","rc3_","rc1_","rc7_","rc0_","rc2_","rc6_","rc1_","rc1_","rc5_","rc3_","rc4_","rc5_","rc4_","rc2_","rc0_","rc1_","rc0_","rc6_","rc0_","rc1_","rc6_","rc3_","rc4_","rc1_","rc2_","rc7_","rc7_","rc1_","rc7_","rc7_","rc2_","rc6_","rc6_","rc5_","rc0_","rc6_","rc6_","rc1_","rc3_","rc4_","rc3_","rc6_","rc7_","rc6_","rc2_","rc7_","rc6_","rc3_","rc3_","rc1_","rc4_","rc0_","rc0_","rc2_","rc3_","rc5_","rc6_","rc2_","rc2_","rc4_","rc1_","rc1_","rc1_","rc1_","rc4_","rc1_","rc1_","rc0_","rc1_","rc6_","rc1_","rc3_","rc6_","rc3_","rc4_","rc4_","rc1_","rc7_","rc1_","rc2_","rc6_","rc0_","rc3_","rc7_","rc6_","rc6_","rc3_","rc1_"],
|
||||||
|
["rc2_","rc3_","rc2_","rc7_","rc0_","rc2_","rc3_","rc7_","rc5_","rc6_","rc0_","rc5_","rc4_","rc4_","rc4_","rc6_","rc6_","rc3_","rc1_","rc6_","rc2_","rc2_","rc3_","rc7_","rc7_","rc4_","rc5_","rc4_","rc0_","rc0_","rc2_","rc5_","rc7_","rc3_","rc7_","rc3_","rc5_","rc2_","rc7_","rc6_","rc0_","rc2_","rc6_","rc4_","rc7_","rc3_","rc2_","rc5_","rc2_","rc5_","rc7_","rc5_","rc5_","rc1_","rc3_","rc2_","rc6_","rc3_","rc2_","rc7_","rc5_","rc7_","rc2_","rc0_","rc4_","rc1_","rc0_","rc7_","rc7_","rc1_","rc5_","rc7_","rc6_","rc7_","rc4_","rc6_","rc0_","rc4_","rc5_","rc0_","rc3_","rc1_","rc7_","rc1_","rc1_","rc3_","rc1_","rc3_","rc4_","rc0_","rc2_","rc2_","rc6_","rc3_","rc1_","rc4_","rc2_","rc6_","rc7_","rc5_","rc7_","rc0_","rc5_","rc1_","rc6_","rc5_","rc0_","rc3_","rc2_","rc6_","rc4_","rc6_","rc0_","rc0_","rc7_","rc2_","rc7_","rc1_","rc5_","rc2_","rc1_","rc0_","rc5_","rc3_","rc2_","rc5_","rc1_","rc7_","rc1_","rc1_","rc3_","rc3_","rc5_","rc6_","rc7_","rc6_","rc1_","rc2_","rc4_","rc3_","rc3_","rc1_","rc7_","rc0_"],
|
||||||
|
["rc2_","rc1_","rc1_","rc0_","rc6_","rc2_","rc7_","rc6_","rc4_","rc5_","rc3_","rc4_","rc2_","rc3_","rc1_","rc2_","rc0_","rc2_","rc5_","rc2_","rc0_","rc4_","rc3_","rc4_","rc7_","rc0_","rc6_","rc6_","rc4_","rc5_","rc5_","rc6_","rc0_","rc4_","rc4_","rc3_","rc7_","rc6_","rc7_","rc0_","rc6_","rc6_","rc4_","rc3_","rc5_","rc0_","rc1_","rc5_","rc0_","rc1_","rc3_","rc2_","rc0_","rc1_","rc1_","rc4_","rc7_","rc7_","rc0_","rc3_","rc4_","rc3_","rc0_","rc0_","rc3_","rc2_","rc7_","rc2_","rc1_","rc5_","rc5_","rc1_","rc7_","rc3_","rc0_","rc0_","rc4_","rc1_","rc1_","rc0_","rc0_","rc7_","rc6_","rc3_","rc6_","rc5_","rc1_","rc6_","rc2_","rc5_","rc1_","rc3_","rc4_","rc2_","rc7_","rc6_","rc3_","rc2_","rc4_","rc6_","rc5_","rc0_","rc1_","rc6_","rc5_","rc5_","rc7_","rc5_","rc7_","rc0_","rc1_","rc3_","rc1_","rc3_","rc6_","rc5_","rc2_","rc0_","rc3_","rc2_","rc7_","rc4_","rc1_","rc6_","rc3_","rc3_","rc2_","rc7_","rc7_","rc4_","rc2_","rc7_","rc2_","rc6_","rc4_","rc2_","rc3_","rc3_","rc2_","rc1_","rc5_","rc4_","rc1_","rc5_"],
|
||||||
|
["rc2_","rc6_","rc4_","rc7_","rc3_","rc3_","rc7_","rc0_","rc7_","rc3_","rc7_","rc4_","rc2_","rc5_","rc1_","rc5_","rc7_","rc1_","rc1_","rc5_","rc2_","rc0_","rc4_","rc4_","rc7_","rc6_","rc7_","rc3_","rc7_","rc6_","rc1_","rc7_","rc4_","rc6_","rc6_","rc2_","rc2_","rc5_","rc6_","rc7_","rc1_","rc3_","rc5_","rc5_","rc0_","rc0_","rc4_","rc6_","rc5_","rc7_","rc1_","rc0_","rc2_","rc4_","rc2_","rc3_","rc2_","rc4_","rc0_","rc4_","rc4_","rc4_","rc1_","rc1_","rc6_","rc5_","rc6_","rc6_","rc7_","rc6_","rc6_","rc0_","rc6_","rc3_","rc2_","rc0_","rc6_","rc4_","rc4_","rc3_","rc6_","rc1_","rc2_","rc7_","rc4_","rc4_","rc7_","rc0_","rc3_","rc7_","rc3_","rc4_","rc5_","rc1_","rc1_","rc3_","rc2_","rc3_","rc2_","rc3_","rc0_","rc7_","rc1_","rc3_","rc5_","rc3_","rc6_","rc7_","rc4_","rc2_","rc7_","rc3_","rc5_","rc4_","rc4_","rc4_","rc0_","rc0_","rc1_","rc3_","rc2_","rc7_","rc2_","rc3_","rc1_","rc2_","rc2_","rc5_","rc5_","rc6_","rc4_","rc1_","rc0_","rc7_","rc5_","rc0_","rc7_","rc3_","rc2_","rc0_","rc1_","rc1_","rc6_","rc0_"],
|
||||||
|
["rc0_","rc2_","rc7_","rc5_","rc5_","rc6_","rc2_","rc4_","rc1_","rc2_","rc3_","rc0_","rc1_","rc1_","rc2_","rc6_","rc1_","rc0_","rc2_","rc7_","rc5_","rc6_","rc4_","rc7_","rc4_","rc4_","rc4_","rc4_","rc6_","rc1_","rc2_","rc0_","rc7_","rc2_","rc3_","rc2_","rc4_","rc0_","rc1_","rc2_","rc6_","rc2_","rc0_","rc4_","rc5_","rc5_","rc2_","rc7_","rc6_","rc0_","rc6_","rc7_","rc0_","rc5_","rc5_","rc7_","rc3_","rc5_","rc5_","rc3_","rc2_","rc3_","rc1_","rc4_","rc3_","rc4_","rc0_","rc5_","rc5_","rc5_","rc5_","rc7_","rc1_","rc6_","rc0_","rc0_","rc4_","rc6_","rc3_","rc0_","rc3_","rc7_","rc7_","rc7_","rc0_","rc3_","rc7_","rc1_","rc5_","rc7_","rc5_","rc4_","rc6_","rc6_","rc5_","rc4_","rc4_","rc1_","rc7_","rc5_","rc7_","rc6_","rc0_","rc1_","rc3_","rc7_","rc3_","rc1_","rc6_","rc5_","rc3_","rc1_","rc1_","rc4_","rc5_","rc0_","rc6_","rc0_","rc4_","rc5_","rc1_","rc0_","rc5_","rc1_","rc1_","rc2_","rc4_","rc0_","rc1_","rc0_","rc6_","rc1_","rc2_","rc2_","rc1_","rc1_","rc4_","rc4_","rc1_","rc2_","rc4_","rc1_","rc4_","rc2_"],
|
||||||
|
["rc0_","rc7_","rc0_","rc1_","rc1_","rc5_","rc3_","rc3_","rc0_","rc2_","rc3_","rc0_","rc4_","rc0_","rc0_","rc0_","rc3_","rc2_","rc7_","rc2_","rc7_","rc1_","rc0_","rc6_","rc3_","rc5_","rc2_","rc2_","rc6_","rc2_","rc5_","rc3_","rc7_","rc1_","rc0_","rc4_","rc2_","rc0_","rc4_","rc3_","rc1_","rc5_","rc1_","rc2_","rc7_","rc7_","rc7_","rc3_","rc1_","rc5_","rc0_","rc0_","rc6_","rc4_","rc5_","rc2_","rc0_","rc2_","rc6_","rc0_","rc3_","rc0_","rc5_","rc3_","rc6_","rc0_","rc5_","rc7_","rc0_","rc4_","rc7_","rc5_","rc5_","rc7_","rc5_","rc6_","rc1_","rc7_","rc3_","rc2_","rc4_","rc3_","rc3_","rc3_","rc6_","rc1_","rc0_","rc3_","rc5_","rc4_","rc5_","rc5_","rc4_","rc4_","rc6_","rc3_","rc6_","rc6_","rc7_","rc4_","rc4_","rc6_","rc4_","rc0_","rc4_","rc2_","rc1_","rc6_","rc3_","rc1_","rc3_","rc5_","rc3_","rc3_","rc6_","rc2_","rc0_","rc3_","rc1_","rc3_","rc7_","rc2_","rc7_","rc1_","rc1_","rc6_","rc7_","rc3_","rc7_","rc3_","rc6_","rc0_","rc6_","rc0_","rc3_","rc5_","rc5_","rc5_","rc4_","rc1_","rc4_","rc4_","rc7_","rc4_"],
|
||||||
|
["rc7_","rc6_","rc3_","rc7_","rc3_","rc7_","rc0_","rc0_","rc1_","rc5_","rc4_","rc4_","rc1_","rc4_","rc0_","rc3_","rc0_","rc6_","rc2_","rc6_","rc5_","rc1_","rc4_","rc4_","rc0_","rc1_","rc5_","rc6_","rc5_","rc0_","rc7_","rc7_","rc0_","rc3_","rc1_","rc0_","rc0_","rc7_","rc5_","rc3_","rc1_","rc3_","rc4_","rc6_","rc4_","rc0_","rc1_","rc2_","rc2_","rc7_","rc4_","rc5_","rc2_","rc1_","rc0_","rc5_","rc7_","rc5_","rc6_","rc6_","rc5_","rc5_","rc3_","rc5_","rc5_","rc2_","rc0_","rc6_","rc7_","rc2_","rc0_","rc3_","rc7_","rc7_","rc0_","rc6_","rc3_","rc1_","rc2_","rc2_","rc4_","rc6_","rc2_","rc4_","rc4_","rc1_","rc5_","rc7_","rc7_","rc1_","rc6_","rc1_","rc5_","rc4_","rc3_","rc0_","rc6_","rc4_","rc0_","rc1_","rc7_","rc0_","rc2_","rc2_","rc4_","rc6_","rc6_","rc6_","rc6_","rc0_","rc3_","rc1_","rc7_","rc4_","rc5_","rc5_","rc4_","rc0_","rc4_","rc4_","rc3_","rc6_","rc5_","rc6_","rc4_","rc4_","rc7_","rc6_","rc5_","rc0_","rc0_","rc0_","rc0_","rc2_","rc1_","rc6_","rc0_","rc2_","rc0_","rc4_","rc4_","rc3_","rc4_","rc0_"],
|
||||||
|
["rc3_","rc0_","rc6_","rc6_","rc1_","rc7_","rc6_","rc2_","rc1_","rc3_","rc3_","rc7_","rc3_","rc6_","rc7_","rc0_","rc7_","rc6_","rc3_","rc5_","rc3_","rc7_","rc7_","rc0_","rc2_","rc2_","rc4_","rc1_","rc6_","rc4_","rc5_","rc7_","rc7_","rc2_","rc3_","rc7_","rc4_","rc4_","rc1_","rc2_","rc1_","rc0_","rc0_","rc2_","rc2_","rc0_","rc4_","rc5_","rc7_","rc6_","rc6_","rc6_","rc0_","rc7_","rc2_","rc0_","rc3_","rc6_","rc4_","rc4_","rc3_","rc3_","rc7_","rc5_","rc4_","rc3_","rc6_","rc2_","rc5_","rc1_","rc7_","rc4_","rc4_","rc5_","rc4_","rc0_","rc0_","rc5_","rc4_","rc7_","rc3_","rc1_","rc2_","rc4_","rc6_","rc3_","rc4_","rc6_","rc2_","rc6_","rc6_","rc7_","rc4_","rc7_","rc0_","rc4_","rc1_","rc2_","rc6_","rc6_","rc3_","rc6_","rc6_","rc7_","rc2_","rc3_","rc7_","rc1_","rc6_","rc2_","rc0_","rc4_","rc3_","rc6_","rc7_","rc7_","rc6_","rc2_","rc3_","rc1_","rc0_","rc3_","rc4_","rc0_","rc1_","rc0_","rc1_","rc2_","rc7_","rc7_","rc2_","rc2_","rc6_","rc1_","rc0_","rc5_","rc2_","rc1_","rc2_","rc5_","rc3_","rc1_","rc1_","rc5_"],
|
||||||
|
["rc0_","rc5_","rc5_","rc7_","rc0_","rc4_","rc1_","rc3_","rc4_","rc5_","rc5_","rc0_","rc1_","rc6_","rc3_","rc0_","rc5_","rc3_","rc4_","rc7_","rc7_","rc4_","rc4_","rc4_","rc4_","rc7_","rc3_","rc4_","rc0_","rc1_","rc5_","rc2_","rc2_","rc7_","rc5_","rc3_","rc3_","rc2_","rc5_","rc2_","rc7_","rc2_","rc1_","rc7_","rc5_","rc2_","rc5_","rc6_","rc4_","rc4_","rc3_","rc5_","rc6_","rc6_","rc2_","rc5_","rc2_","rc6_","rc3_","rc5_","rc4_","rc2_","rc6_","rc3_","rc0_","rc3_","rc5_","rc5_","rc7_","rc3_","rc7_","rc7_","rc1_","rc4_","rc0_","rc5_","rc4_","rc3_","rc6_","rc4_","rc3_","rc5_","rc7_","rc4_","rc3_","rc0_","rc1_","rc0_","rc2_","rc5_","rc3_","rc1_","rc0_","rc5_","rc2_","rc0_","rc3_","rc2_","rc6_","rc3_","rc5_","rc7_","rc7_","rc2_","rc1_","rc2_","rc2_","rc2_","rc6_","rc1_","rc0_","rc1_","rc3_","rc3_","rc0_","rc3_","rc4_","rc1_","rc3_","rc5_","rc4_","rc4_","rc1_","rc0_","rc4_","rc0_","rc3_","rc0_","rc2_","rc2_","rc1_","rc6_","rc5_","rc6_","rc5_","rc2_","rc0_","rc5_","rc7_","rc5_","rc5_","rc4_","rc2_","rc6_"],
|
||||||
|
["rc4_","rc0_","rc6_","rc3_","rc4_","rc1_","rc7_","rc3_","rc1_","rc4_","rc7_","rc2_","rc7_","rc6_","rc0_","rc4_","rc6_","rc5_","rc4_","rc5_","rc6_","rc1_","rc1_","rc1_","rc5_","rc4_","rc7_","rc7_","rc7_","rc5_","rc3_","rc3_","rc5_","rc3_","rc1_","rc5_","rc1_","rc0_","rc5_","rc4_","rc0_","rc4_","rc3_","rc6_","rc1_","rc4_","rc1_","rc4_","rc6_","rc2_","rc1_","rc2_","rc1_","rc7_","rc3_","rc5_","rc1_","rc7_","rc2_","rc0_","rc4_","rc4_","rc5_","rc0_","rc7_","rc5_","rc1_","rc7_","rc3_","rc7_","rc6_","rc6_","rc2_","rc4_","rc7_","rc6_","rc4_","rc4_","rc6_","rc0_","rc3_","rc2_","rc7_","rc3_","rc5_","rc1_","rc3_","rc7_","rc3_","rc6_","rc0_","rc0_","rc5_","rc7_","rc7_","rc5_","rc1_","rc4_","rc7_","rc1_","rc4_","rc5_","rc0_","rc2_","rc7_","rc5_","rc2_","rc0_","rc5_","rc5_","rc7_","rc0_","rc5_","rc4_","rc6_","rc2_","rc3_","rc6_","rc1_","rc7_","rc4_","rc2_","rc1_","rc7_","rc2_","rc0_","rc1_","rc2_","rc4_","rc2_","rc1_","rc5_","rc1_","rc3_","rc4_","rc0_","rc6_","rc6_","rc4_","rc5_","rc7_","rc0_","rc4_","rc3_"],
|
||||||
|
["rc3_","rc0_","rc5_","rc5_","rc3_","rc6_","rc5_","rc5_","rc3_","rc2_","rc6_","rc4_","rc2_","rc6_","rc3_","rc6_","rc7_","rc7_","rc0_","rc1_","rc5_","rc7_","rc2_","rc7_","rc0_","rc7_","rc5_","rc5_","rc0_","rc4_","rc5_","rc3_","rc5_","rc7_","rc6_","rc4_","rc4_","rc1_","rc0_","rc0_","rc1_","rc6_","rc5_","rc1_","rc5_","rc2_","rc5_","rc2_","rc3_","rc1_","rc5_","rc7_","rc5_","rc3_","rc3_","rc0_","rc4_","rc0_","rc5_","rc0_","rc0_","rc1_","rc2_","rc6_","rc5_","rc0_","rc0_","rc1_","rc6_","rc0_","rc0_","rc1_","rc6_","rc7_","rc0_","rc4_","rc5_","rc2_","rc7_","rc6_","rc7_","rc2_","rc6_","rc5_","rc4_","rc7_","rc5_","rc4_","rc3_","rc2_","rc4_","rc5_","rc0_","rc7_","rc3_","rc5_","rc0_","rc3_","rc3_","rc3_","rc3_","rc2_","rc7_","rc0_","rc1_","rc4_","rc5_","rc6_","rc7_","rc0_","rc2_","rc2_","rc4_","rc2_","rc5_","rc4_","rc0_","rc1_","rc2_","rc1_","rc5_","rc4_","rc2_","rc6_","rc0_","rc7_","rc0_","rc7_","rc1_","rc0_","rc7_","rc1_","rc0_","rc7_","rc3_","rc5_","rc3_","rc5_","rc6_","rc6_","rc6_","rc4_","rc4_","rc6_"],
|
||||||
|
["rc2_","rc7_","rc0_","rc3_","rc1_","rc3_","rc0_","rc0_","rc1_","rc7_","rc7_","rc1_","rc7_","rc0_","rc2_","rc6_","rc6_","rc0_","rc5_","rc4_","rc0_","rc0_","rc6_","rc0_","rc3_","rc3_","rc1_","rc6_","rc0_","rc5_","rc6_","rc1_","rc0_","rc3_","rc1_","rc4_","rc0_","rc5_","rc1_","rc0_","rc7_","rc2_","rc3_","rc7_","rc6_","rc2_","rc7_","rc0_","rc7_","rc2_","rc3_","rc4_","rc0_","rc4_","rc6_","rc1_","rc2_","rc5_","rc0_","rc4_","rc5_","rc3_","rc1_","rc4_","rc7_","rc6_","rc7_","rc5_","rc5_","rc5_","rc3_","rc3_","rc0_","rc5_","rc6_","rc7_","rc4_","rc6_","rc0_","rc6_","rc5_","rc7_","rc2_","rc0_","rc3_","rc3_","rc5_","rc7_","rc0_","rc3_","rc2_","rc1_","rc6_","rc6_","rc3_","rc7_","rc6_","rc6_","rc2_","rc7_","rc7_","rc5_","rc0_","rc7_","rc4_","rc0_","rc0_","rc3_","rc2_","rc3_","rc6_","rc0_","rc0_","rc5_","rc2_","rc2_","rc7_","rc5_","rc2_","rc3_","rc4_","rc5_","rc7_","rc5_","rc3_","rc7_","rc6_","rc2_","rc6_","rc5_","rc1_","rc2_","rc7_","rc4_","rc7_","rc5_","rc2_","rc4_","rc2_","rc1_","rc7_","rc1_","rc7_","rc6_"],
|
||||||
|
["rc7_","rc6_","rc4_","rc0_","rc4_","rc3_","rc5_","rc5_","rc6_","rc4_","rc7_","rc0_","rc3_","rc5_","rc0_","rc5_","rc7_","rc2_","rc6_","rc6_","rc4_","rc3_","rc0_","rc5_","rc3_","rc0_","rc2_","rc2_","rc4_","rc1_","rc5_","rc0_","rc3_","rc2_","rc6_","rc3_","rc3_","rc5_","rc6_","rc5_","rc7_","rc0_","rc2_","rc2_","rc7_","rc0_","rc3_","rc0_","rc0_","rc6_","rc0_","rc2_","rc7_","rc1_","rc3_","rc7_","rc7_","rc4_","rc2_","rc6_","rc1_","rc2_","rc7_","rc5_","rc3_","rc7_","rc2_","rc3_","rc4_","rc1_","rc5_","rc3_","rc7_","rc7_","rc0_","rc2_","rc6_","rc0_","rc6_","rc2_","rc1_","rc0_","rc7_","rc0_","rc7_","rc6_","rc0_","rc2_","rc5_","rc1_","rc0_","rc5_","rc5_","rc4_","rc5_","rc6_","rc0_","rc7_","rc6_","rc0_","rc6_","rc1_","rc2_","rc6_","rc5_","rc3_","rc1_","rc1_","rc1_","rc6_","rc0_","rc4_","rc3_","rc0_","rc3_","rc6_","rc5_","rc3_","rc7_","rc7_","rc5_","rc6_","rc6_","rc7_","rc0_","rc0_","rc6_","rc3_","rc1_","rc2_","rc4_","rc2_","rc2_","rc4_","rc5_","rc7_","rc2_","rc3_","rc5_","rc7_","rc7_","rc1_","rc3_","rc6_"],
|
||||||
|
["rc6_","rc6_","rc5_","rc5_","rc1_","rc6_","rc0_","rc7_","rc0_","rc3_","rc3_","rc3_","rc3_","rc5_","rc4_","rc4_","rc7_","rc6_","rc3_","rc0_","rc7_","rc2_","rc6_","rc6_","rc5_","rc7_","rc4_","rc4_","rc1_","rc2_","rc6_","rc0_","rc1_","rc3_","rc3_","rc5_","rc2_","rc1_","rc3_","rc7_","rc6_","rc1_","rc6_","rc3_","rc6_","rc3_","rc6_","rc1_","rc2_","rc5_","rc2_","rc3_","rc6_","rc4_","rc5_","rc3_","rc7_","rc0_","rc6_","rc0_","rc7_","rc0_","rc1_","rc1_","rc5_","rc6_","rc6_","rc5_","rc1_","rc4_","rc0_","rc2_","rc6_","rc7_","rc1_","rc5_","rc1_","rc2_","rc4_","rc1_","rc1_","rc6_","rc3_","rc3_","rc7_","rc1_","rc2_","rc6_","rc0_","rc5_","rc4_","rc2_","rc0_","rc3_","rc4_","rc3_","rc1_","rc7_","rc7_","rc7_","rc5_","rc6_","rc0_","rc7_","rc1_","rc5_","rc3_","rc1_","rc2_","rc3_","rc6_","rc6_","rc4_","rc2_","rc5_","rc0_","rc1_","rc2_","rc6_","rc6_","rc7_","rc7_","rc4_","rc3_","rc5_","rc3_","rc7_","rc4_","rc6_","rc7_","rc4_","rc1_","rc7_","rc7_","rc1_","rc5_","rc6_","rc3_","rc4_","rc1_","rc4_","rc5_","rc4_","rc6_"],
|
||||||
|
["rc5_","rc0_","rc0_","rc2_","rc4_","rc5_","rc7_","rc5_","rc4_","rc4_","rc0_","rc4_","rc5_","rc1_","rc3_","rc5_","rc4_","rc5_","rc6_","rc4_","rc6_","rc7_","rc5_","rc5_","rc6_","rc2_","rc4_","rc4_","rc5_","rc1_","rc7_","rc2_","rc1_","rc0_","rc4_","rc0_","rc2_","rc4_","rc7_","rc1_","rc0_","rc6_","rc6_","rc2_","rc1_","rc4_","rc6_","rc6_","rc2_","rc1_","rc6_","rc0_","rc3_","rc7_","rc2_","rc7_","rc0_","rc1_","rc3_","rc1_","rc6_","rc5_","rc5_","rc1_","rc3_","rc2_","rc1_","rc3_","rc0_","rc7_","rc4_","rc3_","rc3_","rc4_","rc0_","rc0_","rc0_","rc5_","rc1_","rc6_","rc1_","rc4_","rc3_","rc4_","rc6_","rc6_","rc2_","rc3_","rc6_","rc1_","rc1_","rc1_","rc6_","rc3_","rc7_","rc5_","rc1_","rc7_","rc7_","rc3_","rc1_","rc4_","rc0_","rc2_","rc4_","rc7_","rc4_","rc5_","rc3_","rc2_","rc4_","rc7_","rc0_","rc5_","rc4_","rc2_","rc6_","rc4_","rc3_","rc1_","rc5_","rc1_","rc6_","rc4_","rc5_","rc3_","rc6_","rc4_","rc3_","rc6_","rc7_","rc0_","rc2_","rc5_","rc1_","rc0_","rc4_","rc6_","rc4_","rc0_","rc2_","rc5_","rc0_","rc7_"],
|
||||||
|
["rc0_","rc4_","rc3_","rc0_","rc3_","rc2_","rc7_","rc0_","rc7_","rc1_","rc3_","rc2_","rc5_","rc4_","rc0_","rc7_","rc2_","rc0_","rc7_","rc2_","rc6_","rc2_","rc1_","rc3_","rc3_","rc1_","rc7_","rc2_","rc4_","rc6_","rc3_","rc7_","rc0_","rc2_","rc7_","rc7_","rc7_","rc6_","rc5_","rc2_","rc4_","rc1_","rc6_","rc2_","rc4_","rc5_","rc7_","rc6_","rc6_","rc3_","rc0_","rc1_","rc3_","rc1_","rc7_","rc4_","rc0_","rc1_","rc5_","rc3_","rc1_","rc3_","rc7_","rc7_","rc1_","rc6_","rc0_","rc7_","rc7_","rc3_","rc4_","rc5_","rc3_","rc2_","rc0_","rc6_","rc2_","rc1_","rc1_","rc1_","rc6_","rc1_","rc3_","rc4_","rc1_","rc4_","rc3_","rc3_","rc3_","rc5_","rc6_","rc3_","rc2_","rc6_","rc2_","rc7_","rc2_","rc0_","rc6_","rc0_","rc6_","rc6_","rc6_","rc2_","rc5_","rc3_","rc2_","rc4_","rc0_","rc5_","rc0_","rc0_","rc3_","rc2_","rc6_","rc4_","rc1_","rc2_","rc4_","rc0_","rc5_","rc5_","rc2_","rc1_","rc7_","rc7_","rc6_","rc6_","rc4_","rc0_","rc1_","rc1_","rc2_","rc1_","rc2_","rc0_","rc1_","rc4_","rc2_","rc5_","rc5_","rc3_","rc2_","rc2_"],
|
||||||
|
["rc4_","rc4_","rc2_","rc1_","rc3_","rc4_","rc4_","rc3_","rc6_","rc1_","rc1_","rc7_","rc7_","rc4_","rc2_","rc5_","rc7_","rc7_","rc1_","rc4_","rc3_","rc3_","rc0_","rc1_","rc0_","rc6_","rc2_","rc1_","rc2_","rc3_","rc1_","rc0_","rc2_","rc1_","rc0_","rc3_","rc6_","rc1_","rc2_","rc3_","rc5_","rc2_","rc3_","rc3_","rc3_","rc7_","rc6_","rc4_","rc2_","rc4_","rc6_","rc7_","rc2_","rc5_","rc0_","rc3_","rc2_","rc0_","rc1_","rc7_","rc7_","rc3_","rc4_","rc2_","rc4_","rc1_","rc7_","rc1_","rc3_","rc1_","rc7_","rc2_","rc3_","rc7_","rc0_","rc6_","rc3_","rc7_","rc1_","rc3_","rc5_","rc0_","rc0_","rc3_","rc7_","rc6_","rc2_","rc7_","rc6_","rc2_","rc6_","rc1_","rc3_","rc5_","rc3_","rc0_","rc3_","rc2_","rc6_","rc5_","rc2_","rc4_","rc1_","rc6_","rc7_","rc1_","rc0_","rc0_","rc6_","rc5_","rc5_","rc2_","rc2_","rc1_","rc7_","rc0_","rc1_","rc6_","rc7_","rc5_","rc5_","rc5_","rc3_","rc5_","rc7_","rc0_","rc6_","rc2_","rc7_","rc6_","rc7_","rc5_","rc1_","rc3_","rc1_","rc7_","rc2_","rc6_","rc3_","rc1_","rc4_","rc0_","rc1_","rc1_"],
|
||||||
|
["rc7_","rc1_","rc3_","rc5_","rc0_","rc5_","rc5_","rc5_","rc6_","rc7_","rc7_","rc4_","rc2_","rc5_","rc5_","rc7_","rc7_","rc4_","rc1_","rc2_","rc3_","rc5_","rc7_","rc7_","rc4_","rc0_","rc2_","rc0_","rc6_","rc0_","rc5_","rc7_","rc4_","rc0_","rc5_","rc4_","rc6_","rc4_","rc5_","rc7_","rc2_","rc3_","rc2_","rc6_","rc5_","rc3_","rc0_","rc1_","rc3_","rc5_","rc4_","rc4_","rc6_","rc2_","rc4_","rc5_","rc4_","rc7_","rc3_","rc6_","rc4_","rc5_","rc2_","rc5_","rc2_","rc5_","rc3_","rc3_","rc1_","rc2_","rc7_","rc2_","rc0_","rc6_","rc4_","rc3_","rc0_","rc2_","rc7_","rc6_","rc5_","rc0_","rc0_","rc2_","rc3_","rc3_","rc6_","rc0_","rc2_","rc2_","rc0_","rc3_","rc5_","rc0_","rc6_","rc3_","rc0_","rc0_","rc7_","rc3_","rc1_","rc7_","rc4_","rc7_","rc1_","rc2_","rc5_","rc2_","rc2_","rc2_","rc2_","rc7_","rc2_","rc5_","rc5_","rc6_","rc1_","rc7_","rc6_","rc1_","rc0_","rc1_","rc7_","rc7_","rc2_","rc0_","rc2_","rc1_","rc7_","rc1_","rc7_","rc4_","rc7_","rc4_","rc2_","rc6_","rc4_","rc6_","rc5_","rc4_","rc3_","rc4_","rc2_","rc3_"],
|
||||||
|
["rc5_","rc4_","rc3_","rc6_","rc0_","rc6_","rc5_","rc0_","rc3_","rc4_","rc2_","rc2_","rc3_","rc6_","rc6_","rc7_","rc7_","rc0_","rc5_","rc5_","rc2_","rc0_","rc3_","rc7_","rc2_","rc3_","rc4_","rc1_","rc5_","rc7_","rc5_","rc4_","rc4_","rc6_","rc2_","rc3_","rc2_","rc1_","rc2_","rc5_","rc6_","rc3_","rc7_","rc4_","rc6_","rc0_","rc3_","rc4_","rc7_","rc6_","rc0_","rc0_","rc3_","rc3_","rc6_","rc2_","rc3_","rc7_","rc2_","rc1_","rc5_","rc3_","rc4_","rc0_","rc7_","rc2_","rc2_","rc5_","rc5_","rc7_","rc4_","rc7_","rc7_","rc7_","rc0_","rc4_","rc6_","rc0_","rc7_","rc1_","rc0_","rc3_","rc7_","rc3_","rc2_","rc6_","rc2_","rc6_","rc6_","rc4_","rc7_","rc4_","rc6_","rc1_","rc0_","rc0_","rc7_","rc1_","rc4_","rc4_","rc1_","rc0_","rc5_","rc0_","rc6_","rc0_","rc4_","rc3_","rc1_","rc6_","rc3_","rc6_","rc1_","rc5_","rc4_","rc7_","rc6_","rc0_","rc1_","rc4_","rc4_","rc2_","rc4_","rc2_","rc5_","rc0_","rc7_","rc4_","rc4_","rc1_","rc6_","rc7_","rc7_","rc5_","rc4_","rc6_","rc4_","rc4_","rc3_","rc1_","rc0_","rc0_","rc0_","rc3_"],
|
||||||
|
["rc3_","rc6_","rc6_","rc4_","rc0_","rc1_","rc2_","rc4_","rc4_","rc0_","rc7_","rc2_","rc5_","rc0_","rc3_","rc4_","rc5_","rc4_","rc1_","rc0_","rc6_","rc5_","rc1_","rc2_","rc1_","rc5_","rc5_","rc6_","rc2_","rc0_","rc5_","rc0_","rc6_","rc5_","rc5_","rc2_","rc7_","rc1_","rc5_","rc6_","rc7_","rc6_","rc1_","rc5_","rc4_","rc2_","rc2_","rc0_","rc3_","rc2_","rc6_","rc5_","rc0_","rc0_","rc3_","rc3_","rc4_","rc2_","rc2_","rc1_","rc0_","rc6_","rc1_","rc5_","rc1_","rc3_","rc1_","rc1_","rc4_","rc1_","rc2_","rc2_","rc4_","rc4_","rc3_","rc3_","rc2_","rc5_","rc6_","rc7_","rc5_","rc1_","rc3_","rc7_","rc2_","rc6_","rc4_","rc3_","rc5_","rc4_","rc2_","rc4_","rc1_","rc0_","rc6_","rc1_","rc4_","rc7_","rc2_","rc0_","rc7_","rc0_","rc1_","rc0_","rc4_","rc3_","rc3_","rc4_","rc0_","rc1_","rc6_","rc2_","rc4_","rc3_","rc2_","rc5_","rc6_","rc0_","rc3_","rc1_","rc6_","rc1_","rc5_","rc5_","rc6_","rc0_","rc3_","rc5_","rc0_","rc1_","rc0_","rc0_","rc7_","rc7_","rc2_","rc7_","rc7_","rc1_","rc3_","rc0_","rc6_","rc7_","rc2_","rc1_"],
|
||||||
|
["rc7_","rc0_","rc1_","rc1_","rc4_","rc5_","rc0_","rc4_","rc4_","rc4_","rc3_","rc5_","rc6_","rc5_","rc0_","rc1_","rc5_","rc1_","rc3_","rc1_","rc4_","rc5_","rc5_","rc0_","rc4_","rc1_","rc2_","rc6_","rc3_","rc5_","rc2_","rc4_","rc7_","rc6_","rc2_","rc1_","rc4_","rc6_","rc4_","rc5_","rc2_","rc2_","rc4_","rc4_","rc2_","rc0_","rc5_","rc5_","rc2_","rc0_","rc3_","rc3_","rc7_","rc2_","rc2_","rc3_","rc3_","rc0_","rc7_","rc7_","rc0_","rc6_","rc6_","rc3_","rc4_","rc7_","rc4_","rc6_","rc5_","rc2_","rc5_","rc4_","rc6_","rc5_","rc1_","rc1_","rc2_","rc0_","rc2_","rc0_","rc0_","rc5_","rc1_","rc5_","rc0_","rc6_","rc1_","rc0_","rc6_","rc0_","rc4_","rc3_","rc4_","rc7_","rc6_","rc5_","rc5_","rc2_","rc7_","rc1_","rc7_","rc1_","rc4_","rc0_","rc0_","rc4_","rc0_","rc6_","rc5_","rc5_","rc7_","rc4_","rc6_","rc0_","rc3_","rc1_","rc6_","rc2_","rc3_","rc6_","rc2_","rc0_","rc0_","rc2_","rc0_","rc2_","rc2_","rc4_","rc2_","rc0_","rc3_","rc7_","rc3_","rc3_","rc1_","rc3_","rc1_","rc7_","rc2_","rc1_","rc3_","rc7_","rc4_","rc7_"],
|
||||||
|
["rc5_","rc2_","rc3_","rc5_","rc2_","rc5_","rc6_","rc7_","rc2_","rc1_","rc3_","rc4_","rc4_","rc6_","rc2_","rc6_","rc5_","rc0_","rc0_","rc3_","rc1_","rc1_","rc5_","rc3_","rc1_","rc7_","rc0_","rc3_","rc6_","rc7_","rc1_","rc2_","rc5_","rc2_","rc7_","rc2_","rc4_","rc7_","rc3_","rc1_","rc3_","rc2_","rc5_","rc0_","rc7_","rc4_","rc6_","rc4_","rc3_","rc2_","rc6_","rc3_","rc0_","rc2_","rc6_","rc1_","rc7_","rc3_","rc0_","rc4_","rc4_","rc4_","rc6_","rc5_","rc5_","rc0_","rc1_","rc0_","rc2_","rc1_","rc3_","rc5_","rc0_","rc3_","rc6_","rc0_","rc1_","rc2_","rc6_","rc5_","rc7_","rc6_","rc5_","rc1_","rc1_","rc6_","rc6_","rc5_","rc4_","rc3_","rc4_","rc4_","rc5_","rc7_","rc3_","rc7_","rc6_","rc5_","rc7_","rc7_","rc7_","rc2_","rc4_","rc3_","rc7_","rc4_","rc6_","rc2_","rc3_","rc2_","rc3_","rc3_","rc7_","rc5_","rc5_","rc3_","rc3_","rc6_","rc3_","rc7_","rc7_","rc0_","rc3_","rc2_","rc2_","rc6_","rc1_","rc2_","rc7_","rc0_","rc3_","rc6_","rc1_","rc2_","rc0_","rc2_","rc1_","rc6_","rc6_","rc7_","rc5_","rc4_","rc3_","rc4_"],
|
||||||
|
["rc3_","rc6_","rc6_","rc2_","rc7_","rc1_","rc7_","rc6_","rc1_","rc1_","rc4_","rc0_","rc2_","rc3_","rc6_","rc4_","rc0_","rc1_","rc4_","rc6_","rc1_","rc2_","rc6_","rc4_","rc5_","rc0_","rc4_","rc7_","rc6_","rc6_","rc7_","rc1_","rc4_","rc2_","rc0_","rc5_","rc4_","rc7_","rc1_","rc4_","rc1_","rc6_","rc1_","rc4_","rc6_","rc6_","rc4_","rc6_","rc3_","rc1_","rc1_","rc7_","rc6_","rc1_","rc5_","rc7_","rc3_","rc3_","rc1_","rc1_","rc7_","rc2_","rc0_","rc2_","rc2_","rc7_","rc4_","rc6_","rc3_","rc1_","rc1_","rc7_","rc0_","rc7_","rc1_","rc7_","rc6_","rc5_","rc1_","rc0_","rc6_","rc7_","rc4_","rc1_","rc1_","rc7_","rc7_","rc4_","rc5_","rc5_","rc5_","rc6_","rc0_","rc0_","rc4_","rc7_","rc4_","rc0_","rc0_","rc3_","rc4_","rc5_","rc6_","rc0_","rc6_","rc5_","rc4_","rc1_","rc1_","rc2_","rc7_","rc2_","rc1_","rc3_","rc4_","rc4_","rc1_","rc5_","rc3_","rc3_","rc0_","rc0_","rc1_","rc7_","rc0_","rc6_","rc5_","rc0_","rc3_","rc2_","rc6_","rc5_","rc6_","rc6_","rc2_","rc7_","rc2_","rc7_","rc2_","rc1_","rc0_","rc5_","rc4_","rc3_"],
|
||||||
|
["rc5_","rc5_","rc1_","rc0_","rc7_","rc1_","rc1_","rc4_","rc7_","rc4_","rc3_","rc2_","rc7_","rc6_","rc2_","rc4_","rc6_","rc7_","rc4_","rc4_","rc1_","rc1_","rc4_","rc3_","rc5_","rc6_","rc3_","rc1_","rc2_","rc4_","rc2_","rc4_","rc2_","rc6_","rc3_","rc4_","rc2_","rc6_","rc1_","rc6_","rc0_","rc7_","rc5_","rc7_","rc6_","rc0_","rc3_","rc4_","rc6_","rc5_","rc4_","rc0_","rc7_","rc0_","rc4_","rc6_","rc6_","rc1_","rc7_","rc7_","rc0_","rc1_","rc0_","rc5_","rc7_","rc5_","rc2_","rc1_","rc3_","rc1_","rc3_","rc3_","rc3_","rc3_","rc6_","rc0_","rc5_","rc2_","rc7_","rc0_","rc2_","rc7_","rc4_","rc1_","rc5_","rc2_","rc2_","rc6_","rc6_","rc0_","rc6_","rc4_","rc1_","rc3_","rc6_","rc6_","rc4_","rc3_","rc7_","rc7_","rc2_","rc4_","rc7_","rc1_","rc1_","rc0_","rc5_","rc3_","rc3_","rc6_","rc0_","rc0_","rc3_","rc2_","rc6_","rc6_","rc6_","rc0_","rc7_","rc4_","rc4_","rc3_","rc0_","rc0_","rc6_","rc3_","rc4_","rc7_","rc3_","rc7_","rc0_","rc6_","rc6_","rc6_","rc5_","rc1_","rc2_","rc4_","rc4_","rc2_","rc1_","rc3_","rc5_","rc4_"],
|
||||||
|
["rc1_","rc0_","rc1_","rc0_","rc0_","rc0_","rc1_","rc0_","rc1_","rc3_","rc6_","rc2_","rc7_","rc0_","rc2_","rc0_","rc2_","rc1_","rc6_","rc6_","rc0_","rc7_","rc6_","rc3_","rc5_","rc1_","rc2_","rc3_","rc6_","rc2_","rc6_","rc3_","rc3_","rc1_","rc5_","rc7_","rc3_","rc4_","rc1_","rc2_","rc4_","rc7_","rc6_","rc4_","rc3_","rc2_","rc0_","rc0_","rc1_","rc1_","rc1_","rc6_","rc7_","rc0_","rc0_","rc6_","rc3_","rc6_","rc7_","rc7_","rc3_","rc1_","rc3_","rc7_","rc1_","rc3_","rc1_","rc3_","rc0_","rc4_","rc7_","rc1_","rc6_","rc7_","rc1_","rc4_","rc3_","rc1_","rc6_","rc0_","rc1_","rc0_","rc2_","rc7_","rc4_","rc0_","rc4_","rc4_","rc3_","rc4_","rc3_","rc5_","rc0_","rc3_","rc4_","rc6_","rc4_","rc0_","rc7_","rc4_","rc7_","rc6_","rc4_","rc6_","rc7_","rc4_","rc0_","rc3_","rc6_","rc6_","rc4_","rc0_","rc1_","rc5_","rc7_","rc1_","rc6_","rc0_","rc3_","rc3_","rc6_","rc2_","rc6_","rc7_","rc4_","rc5_","rc2_","rc1_","rc4_","rc7_","rc6_","rc1_","rc7_","rc4_","rc6_","rc1_","rc6_","rc5_","rc1_","rc1_","rc5_","rc0_","rc2_","rc0_"],
|
||||||
|
["rc2_","rc0_","rc2_","rc4_","rc6_","rc6_","rc3_","rc4_","rc4_","rc0_","rc0_","rc3_","rc7_","rc1_","rc3_","rc7_","rc1_","rc1_","rc7_","rc3_","rc1_","rc6_","rc7_","rc2_","rc4_","rc2_","rc6_","rc6_","rc7_","rc0_","rc1_","rc0_","rc4_","rc2_","rc1_","rc0_","rc4_","rc4_","rc6_","rc7_","rc4_","rc6_","rc1_","rc2_","rc2_","rc6_","rc0_","rc2_","rc2_","rc4_","rc0_","rc2_","rc4_","rc2_","rc5_","rc1_","rc0_","rc4_","rc6_","rc1_","rc5_","rc4_","rc7_","rc7_","rc6_","rc2_","rc6_","rc4_","rc7_","rc2_","rc2_","rc3_","rc6_","rc5_","rc1_","rc4_","rc5_","rc4_","rc2_","rc0_","rc7_","rc2_","rc2_","rc6_","rc1_","rc2_","rc2_","rc6_","rc3_","rc2_","rc0_","rc4_","rc7_","rc6_","rc5_","rc6_","rc1_","rc0_","rc0_","rc1_","rc7_","rc6_","rc1_","rc2_","rc3_","rc4_","rc0_","rc1_","rc7_","rc4_","rc7_","rc2_","rc1_","rc3_","rc5_","rc7_","rc7_","rc6_","rc5_","rc0_","rc4_","rc4_","rc6_","rc5_","rc4_","rc6_","rc4_","rc5_","rc4_","rc4_","rc7_","rc0_","rc5_","rc2_","rc2_","rc2_","rc3_","rc3_","rc7_","rc0_","rc1_","rc5_","rc1_","rc0_"],
|
||||||
|
["rc0_","rc6_","rc1_","rc4_","rc7_","rc4_","rc6_","rc0_","rc4_","rc3_","rc7_","rc5_","rc4_","rc2_","rc2_","rc4_","rc0_","rc7_","rc3_","rc7_","rc1_","rc5_","rc5_","rc4_","rc5_","rc3_","rc4_","rc3_","rc2_","rc7_","rc6_","rc2_","rc3_","rc3_","rc7_","rc7_","rc1_","rc6_","rc4_","rc6_","rc3_","rc6_","rc3_","rc4_","rc1_","rc4_","rc1_","rc3_","rc5_","rc0_","rc3_","rc6_","rc3_","rc0_","rc2_","rc0_","rc2_","rc3_","rc0_","rc0_","rc3_","rc3_","rc0_","rc0_","rc2_","rc2_","rc5_","rc6_","rc4_","rc3_","rc1_","rc2_","rc0_","rc5_","rc2_","rc1_","rc0_","rc4_","rc0_","rc2_","rc2_","rc0_","rc1_","rc7_","rc1_","rc2_","rc0_","rc6_","rc2_","rc4_","rc4_","rc0_","rc4_","rc0_","rc5_","rc1_","rc7_","rc4_","rc5_","rc2_","rc0_","rc4_","rc4_","rc4_","rc4_","rc0_","rc4_","rc6_","rc4_","rc0_","rc6_","rc0_","rc7_","rc6_","rc5_","rc0_","rc6_","rc3_","rc1_","rc5_","rc4_","rc4_","rc7_","rc3_","rc4_","rc6_","rc7_","rc6_","rc0_","rc0_","rc5_","rc3_","rc7_","rc0_","rc5_","rc3_","rc6_","rc0_","rc1_","rc1_","rc2_","rc2_","rc5_","rc6_"],
|
||||||
|
["rc5_","rc2_","rc5_","rc2_","rc0_","rc3_","rc5_","rc6_","rc0_","rc5_","rc0_","rc0_","rc4_","rc6_","rc5_","rc7_","rc5_","rc6_","rc7_","rc0_","rc6_","rc7_","rc4_","rc0_","rc7_","rc4_","rc1_","rc3_","rc5_","rc1_","rc4_","rc4_","rc4_","rc4_","rc2_","rc5_","rc7_","rc3_","rc2_","rc2_","rc7_","rc6_","rc1_","rc1_","rc3_","rc6_","rc7_","rc4_","rc7_","rc6_","rc2_","rc3_","rc0_","rc1_","rc1_","rc3_","rc6_","rc5_","rc4_","rc4_","rc3_","rc6_","rc3_","rc2_","rc3_","rc5_","rc4_","rc1_","rc5_","rc2_","rc1_","rc7_","rc1_","rc0_","rc1_","rc4_","rc2_","rc1_","rc5_","rc5_","rc6_","rc1_","rc6_","rc2_","rc3_","rc7_","rc5_","rc4_","rc4_","rc1_","rc3_","rc3_","rc4_","rc0_","rc2_","rc7_","rc3_","rc4_","rc3_","rc6_","rc7_","rc1_","rc2_","rc5_","rc5_","rc2_","rc7_","rc2_","rc0_","rc4_","rc7_","rc1_","rc1_","rc7_","rc2_","rc6_","rc7_","rc0_","rc6_","rc3_","rc1_","rc2_","rc4_","rc2_","rc2_","rc7_","rc1_","rc5_","rc3_","rc2_","rc0_","rc3_","rc0_","rc6_","rc5_","rc6_","rc4_","rc4_","rc5_","rc3_","rc6_","rc1_","rc5_","rc2_"],
|
||||||
|
["rc0_","rc6_","rc0_","rc7_","rc5_","rc4_","rc5_","rc7_","rc4_","rc0_","rc0_","rc7_","rc2_","rc3_","rc0_","rc2_","rc4_","rc5_","rc1_","rc1_","rc5_","rc3_","rc3_","rc0_","rc5_","rc7_","rc2_","rc7_","rc3_","rc7_","rc7_","rc6_","rc4_","rc0_","rc7_","rc4_","rc5_","rc4_","rc3_","rc2_","rc5_","rc1_","rc0_","rc3_","rc6_","rc5_","rc7_","rc7_","rc6_","rc7_","rc0_","rc0_","rc1_","rc0_","rc2_","rc4_","rc1_","rc1_","rc6_","rc5_","rc0_","rc6_","rc5_","rc6_","rc5_","rc4_","rc7_","rc7_","rc6_","rc7_","rc6_","rc2_","rc5_","rc7_","rc2_","rc6_","rc6_","rc4_","rc6_","rc4_","rc0_","rc0_","rc3_","rc0_","rc2_","rc3_","rc4_","rc2_","rc7_","rc5_","rc1_","rc6_","rc5_","rc7_","rc0_","rc1_","rc3_","rc3_","rc0_","rc6_","rc1_","rc5_","rc0_","rc0_","rc4_","rc2_","rc0_","rc0_","rc2_","rc1_","rc6_","rc0_","rc2_","rc6_","rc4_","rc1_","rc0_","rc6_","rc7_","rc2_","rc0_","rc0_","rc3_","rc3_","rc1_","rc1_","rc6_","rc1_","rc5_","rc3_","rc2_","rc2_","rc5_","rc7_","rc7_","rc3_","rc1_","rc0_","rc1_","rc0_","rc1_","rc2_","rc5_","rc5_"],
|
||||||
|
["rc6_","rc3_","rc1_","rc2_","rc4_","rc1_","rc5_","rc4_","rc4_","rc4_","rc5_","rc2_","rc5_","rc5_","rc0_","rc4_","rc3_","rc6_","rc6_","rc3_","rc3_","rc4_","rc5_","rc5_","rc5_","rc3_","rc4_","rc0_","rc3_","rc1_","rc4_","rc1_","rc1_","rc6_","rc4_","rc5_","rc6_","rc2_","rc5_","rc7_","rc2_","rc0_","rc5_","rc3_","rc0_","rc1_","rc7_","rc3_","rc6_","rc4_","rc2_","rc1_","rc2_","rc4_","rc1_","rc4_","rc0_","rc3_","rc3_","rc6_","rc1_","rc6_","rc4_","rc5_","rc6_","rc0_","rc4_","rc0_","rc5_","rc3_","rc6_","rc5_","rc3_","rc4_","rc4_","rc0_","rc3_","rc7_","rc1_","rc6_","rc6_","rc4_","rc7_","rc3_","rc3_","rc0_","rc2_","rc1_","rc1_","rc6_","rc5_","rc3_","rc3_","rc7_","rc3_","rc1_","rc3_","rc0_","rc1_","rc4_","rc2_","rc3_","rc2_","rc4_","rc6_","rc1_","rc3_","rc7_","rc5_","rc7_","rc0_","rc5_","rc2_","rc6_","rc6_","rc2_","rc6_","rc7_","rc2_","rc4_","rc0_","rc6_","rc2_","rc6_","rc0_","rc6_","rc3_","rc5_","rc0_","rc6_","rc3_","rc0_","rc4_","rc3_","rc0_","rc5_","rc4_","rc6_","rc0_","rc1_","rc7_","rc7_","rc2_","rc0_"],
|
||||||
|
["rc2_","rc2_","rc5_","rc7_","rc2_","rc1_","rc0_","rc5_","rc6_","rc2_","rc2_","rc1_","rc1_","rc3_","rc3_","rc0_","rc6_","rc3_","rc2_","rc6_","rc4_","rc2_","rc0_","rc7_","rc4_","rc3_","rc4_","rc6_","rc1_","rc1_","rc1_","rc6_","rc0_","rc1_","rc6_","rc7_","rc0_","rc7_","rc4_","rc4_","rc3_","rc3_","rc5_","rc2_","rc5_","rc4_","rc2_","rc3_","rc5_","rc5_","rc6_","rc4_","rc1_","rc0_","rc2_","rc4_","rc7_","rc1_","rc0_","rc6_","rc2_","rc4_","rc4_","rc0_","rc2_","rc2_","rc7_","rc5_","rc7_","rc7_","rc6_","rc0_","rc6_","rc7_","rc3_","rc3_","rc5_","rc3_","rc2_","rc6_","rc4_","rc6_","rc7_","rc3_","rc4_","rc6_","rc6_","rc2_","rc5_","rc7_","rc3_","rc1_","rc3_","rc1_","rc3_","rc6_","rc0_","rc5_","rc2_","rc0_","rc0_","rc3_","rc6_","rc3_","rc0_","rc1_","rc4_","rc2_","rc0_","rc7_","rc2_","rc1_","rc3_","rc6_","rc5_","rc3_","rc5_","rc2_","rc4_","rc2_","rc5_","rc5_","rc4_","rc6_","rc3_","rc7_","rc6_","rc0_","rc3_","rc3_","rc6_","rc7_","rc2_","rc3_","rc4_","rc3_","rc0_","rc6_","rc0_","rc7_","rc7_","rc1_","rc2_","rc4_"],
|
||||||
|
["rc4_","rc4_","rc0_","rc4_","rc3_","rc6_","rc4_","rc4_","rc7_","rc4_","rc5_","rc6_","rc3_","rc6_","rc5_","rc6_","rc2_","rc2_","rc2_","rc3_","rc6_","rc6_","rc1_","rc0_","rc7_","rc0_","rc0_","rc4_","rc2_","rc0_","rc2_","rc7_","rc4_","rc0_","rc1_","rc6_","rc7_","rc2_","rc6_","rc0_","rc5_","rc3_","rc5_","rc2_","rc2_","rc7_","rc0_","rc7_","rc7_","rc5_","rc0_","rc4_","rc3_","rc4_","rc3_","rc4_","rc5_","rc6_","rc2_","rc0_","rc0_","rc4_","rc2_","rc1_","rc6_","rc2_","rc6_","rc0_","rc0_","rc5_","rc3_","rc6_","rc4_","rc2_","rc4_","rc7_","rc1_","rc0_","rc7_","rc5_","rc7_","rc1_","rc7_","rc2_","rc2_","rc5_","rc3_","rc6_","rc1_","rc0_","rc7_","rc2_","rc2_","rc5_","rc2_","rc3_","rc0_","rc3_","rc0_","rc3_","rc7_","rc7_","rc1_","rc5_","rc7_","rc1_","rc2_","rc0_","rc7_","rc3_","rc2_","rc6_","rc4_","rc0_","rc7_","rc5_","rc3_","rc2_","rc2_","rc5_","rc3_","rc7_","rc0_","rc3_","rc7_","rc4_","rc2_","rc5_","rc2_","rc2_","rc0_","rc7_","rc3_","rc0_","rc2_","rc6_","rc4_","rc1_","rc7_","rc4_","rc5_","rc0_","rc1_","rc3_"],
|
||||||
|
["rc6_","rc1_","rc0_","rc4_","rc5_","rc2_","rc6_","rc2_","rc5_","rc2_","rc3_","rc3_","rc0_","rc0_","rc3_","rc7_","rc5_","rc7_","rc4_","rc4_","rc5_","rc1_","rc4_","rc1_","rc3_","rc1_","rc3_","rc2_","rc3_","rc6_","rc4_","rc3_","rc5_","rc5_","rc2_","rc1_","rc1_","rc5_","rc1_","rc5_","rc4_","rc1_","rc2_","rc2_","rc4_","rc1_","rc3_","rc1_","rc1_","rc3_","rc6_","rc2_","rc5_","rc1_","rc1_","rc6_","rc5_","rc2_","rc6_","rc3_","rc0_","rc5_","rc4_","rc0_","rc7_","rc2_","rc5_","rc2_","rc6_","rc4_","rc1_","rc6_","rc3_","rc5_","rc4_","rc7_","rc4_","rc0_","rc3_","rc2_","rc5_","rc5_","rc5_","rc0_","rc2_","rc0_","rc7_","rc5_","rc2_","rc3_","rc0_","rc7_","rc5_","rc5_","rc7_","rc0_","rc7_","rc3_","rc1_","rc0_","rc5_","rc6_","rc0_","rc4_","rc7_","rc5_","rc0_","rc3_","rc7_","rc4_","rc4_","rc3_","rc2_","rc5_","rc0_","rc0_","rc4_","rc6_","rc0_","rc5_","rc1_","rc4_","rc1_","rc6_","rc1_","rc7_","rc6_","rc4_","rc3_","rc5_","rc7_","rc2_","rc5_","rc3_","rc5_","rc1_","rc3_","rc1_","rc0_","rc7_","rc6_","rc6_","rc4_","rc5_"],
|
||||||
|
["rc7_","rc4_","rc1_","rc0_","rc5_","rc4_","rc3_","rc7_","rc3_","rc5_","rc2_","rc7_","rc5_","rc2_","rc2_","rc4_","rc4_","rc2_","rc5_","rc2_","rc7_","rc4_","rc7_","rc3_","rc5_","rc1_","rc3_","rc1_","rc1_","rc4_","rc5_","rc5_","rc5_","rc0_","rc7_","rc1_","rc2_","rc2_","rc7_","rc4_","rc7_","rc7_","rc1_","rc4_","rc0_","rc6_","rc1_","rc0_","rc1_","rc1_","rc4_","rc6_","rc3_","rc0_","rc0_","rc3_","rc5_","rc6_","rc1_","rc1_","rc7_","rc0_","rc5_","rc6_","rc4_","rc4_","rc2_","rc3_","rc6_","rc6_","rc6_","rc1_","rc6_","rc1_","rc0_","rc3_","rc3_","rc4_","rc5_","rc0_","rc2_","rc2_","rc5_","rc7_","rc0_","rc7_","rc7_","rc1_","rc5_","rc7_","rc2_","rc1_","rc1_","rc1_","rc6_","rc7_","rc3_","rc5_","rc2_","rc5_","rc7_","rc2_","rc7_","rc1_","rc7_","rc3_","rc5_","rc5_","rc6_","rc3_","rc5_","rc3_","rc1_","rc6_","rc6_","rc5_","rc7_","rc1_","rc4_","rc4_","rc2_","rc5_","rc6_","rc7_","rc6_","rc0_","rc7_","rc7_","rc2_","rc5_","rc7_","rc0_","rc5_","rc5_","rc2_","rc3_","rc3_","rc6_","rc2_","rc2_","rc0_","rc3_","rc1_","rc2_"],
|
||||||
|
["rc4_","rc4_","rc1_","rc0_","rc7_","rc7_","rc7_","rc6_","rc6_","rc7_","rc5_","rc5_","rc7_","rc4_","rc7_","rc7_","rc2_","rc3_","rc1_","rc5_","rc1_","rc0_","rc7_","rc6_","rc1_","rc1_","rc5_","rc1_","rc1_","rc4_","rc0_","rc5_","rc3_","rc4_","rc5_","rc7_","rc1_","rc0_","rc0_","rc5_","rc1_","rc5_","rc7_","rc1_","rc4_","rc5_","rc0_","rc7_","rc3_","rc7_","rc0_","rc2_","rc3_","rc1_","rc6_","rc3_","rc3_","rc4_","rc0_","rc4_","rc3_","rc7_","rc4_","rc4_","rc7_","rc7_","rc1_","rc4_","rc4_","rc5_","rc7_","rc2_","rc3_","rc7_","rc4_","rc3_","rc4_","rc4_","rc1_","rc7_","rc4_","rc2_","rc5_","rc7_","rc2_","rc3_","rc0_","rc2_","rc6_","rc0_","rc2_","rc1_","rc3_","rc3_","rc4_","rc7_","rc7_","rc3_","rc7_","rc5_","rc1_","rc4_","rc5_","rc5_","rc2_","rc6_","rc5_","rc5_","rc7_","rc0_","rc2_","rc6_","rc6_","rc3_","rc6_","rc6_","rc6_","rc3_","rc3_","rc3_","rc4_","rc4_","rc2_","rc1_","rc4_","rc1_","rc0_","rc5_","rc5_","rc3_","rc6_","rc3_","rc7_","rc7_","rc0_","rc5_","rc1_","rc1_","rc0_","rc5_","rc6_","rc1_","rc3_","rc6_"],
|
||||||
|
["rc0_","rc3_","rc4_","rc5_","rc1_","rc3_","rc0_","rc5_","rc5_","rc0_","rc2_","rc4_","rc4_","rc0_","rc0_","rc0_","rc6_","rc4_","rc6_","rc6_","rc7_","rc6_","rc1_","rc4_","rc6_","rc0_","rc6_","rc5_","rc1_","rc7_","rc4_","rc5_","rc3_","rc0_","rc0_","rc6_","rc1_","rc2_","rc0_","rc2_","rc1_","rc4_","rc1_","rc1_","rc3_","rc0_","rc4_","rc6_","rc4_","rc0_","rc7_","rc5_","rc1_","rc0_","rc1_","rc0_","rc2_","rc4_","rc0_","rc3_","rc7_","rc3_","rc6_","rc4_","rc7_","rc4_","rc0_","rc7_","rc6_","rc0_","rc1_","rc0_","rc6_","rc1_","rc7_","rc2_","rc2_","rc1_","rc5_","rc0_","rc7_","rc6_","rc1_","rc2_","rc4_","rc5_","rc6_","rc2_","rc4_","rc4_","rc4_","rc0_","rc1_","rc4_","rc7_","rc3_","rc3_","rc7_","rc6_","rc0_","rc1_","rc6_","rc4_","rc0_","rc7_","rc6_","rc4_","rc5_","rc1_","rc4_","rc1_","rc5_","rc7_","rc7_","rc4_","rc3_","rc1_","rc5_","rc2_","rc2_","rc5_","rc0_","rc4_","rc3_","rc6_","rc2_","rc0_","rc1_","rc7_","rc7_","rc0_","rc3_","rc1_","rc3_","rc2_","rc2_","rc2_","rc4_","rc0_","rc3_","rc7_","rc0_","rc1_","rc7_"],
|
||||||
|
["rc2_","rc2_","rc0_","rc1_","rc7_","rc1_","rc3_","rc0_","rc4_","rc1_","rc7_","rc6_","rc7_","rc6_","rc1_","rc0_","rc5_","rc6_","rc0_","rc7_","rc7_","rc7_","rc2_","rc5_","rc7_","rc1_","rc4_","rc4_","rc5_","rc5_","rc6_","rc4_","rc3_","rc7_","rc5_","rc4_","rc7_","rc7_","rc3_","rc3_","rc2_","rc6_","rc4_","rc7_","rc4_","rc7_","rc3_","rc6_","rc2_","rc4_","rc5_","rc3_","rc3_","rc3_","rc3_","rc3_","rc0_","rc0_","rc6_","rc0_","rc2_","rc4_","rc6_","rc6_","rc0_","rc6_","rc4_","rc4_","rc0_","rc2_","rc0_","rc5_","rc6_","rc7_","rc5_","rc7_","rc4_","rc6_","rc4_","rc4_","rc1_","rc7_","rc7_","rc0_","rc4_","rc6_","rc7_","rc2_","rc2_","rc6_","rc7_","rc7_","rc7_","rc4_","rc3_","rc2_","rc2_","rc0_","rc3_","rc0_","rc3_","rc7_","rc4_","rc4_","rc1_","rc5_","rc1_","rc6_","rc7_","rc1_","rc6_","rc2_","rc0_","rc1_","rc5_","rc6_","rc3_","rc0_","rc5_","rc3_","rc0_","rc5_","rc0_","rc0_","rc3_","rc5_","rc3_","rc3_","rc0_","rc4_","rc3_","rc2_","rc0_","rc0_","rc6_","rc1_","rc3_","rc7_","rc0_","rc4_","rc7_","rc2_","rc7_","rc0_"],
|
||||||
|
["rc7_","rc1_","rc1_","rc5_","rc7_","rc1_","rc5_","rc6_","rc7_","rc4_","rc7_","rc4_","rc7_","rc0_","rc0_","rc0_","rc2_","rc2_","rc5_","rc0_","rc6_","rc4_","rc6_","rc4_","rc3_","rc5_","rc2_","rc1_","rc1_","rc0_","rc1_","rc5_","rc7_","rc0_","rc2_","rc4_","rc1_","rc2_","rc7_","rc3_","rc2_","rc3_","rc6_","rc3_","rc3_","rc4_","rc0_","rc0_","rc2_","rc3_","rc7_","rc3_","rc6_","rc4_","rc4_","rc4_","rc1_","rc7_","rc7_","rc4_","rc0_","rc4_","rc3_","rc2_","rc0_","rc4_","rc0_","rc5_","rc1_","rc2_","rc3_","rc1_","rc7_","rc3_","rc3_","rc5_","rc6_","rc1_","rc5_","rc4_","rc6_","rc6_","rc3_","rc3_","rc7_","rc7_","rc0_","rc3_","rc7_","rc6_","rc7_","rc6_","rc1_","rc5_","rc5_","rc0_","rc1_","rc0_","rc3_","rc6_","rc6_","rc2_","rc1_","rc2_","rc6_","rc3_","rc0_","rc2_","rc0_","rc0_","rc6_","rc5_","rc6_","rc3_","rc7_","rc7_","rc2_","rc5_","rc2_","rc7_","rc2_","rc1_","rc2_","rc7_","rc7_","rc3_","rc6_","rc4_","rc2_","rc1_","rc4_","rc0_","rc0_","rc1_","rc1_","rc4_","rc0_","rc3_","rc3_","rc1_","rc2_","rc0_","rc3_","rc0_"],
|
||||||
|
["rc3_","rc3_","rc5_","rc0_","rc6_","rc6_","rc2_","rc1_","rc5_","rc1_","rc0_","rc7_","rc0_","rc7_","rc0_","rc1_","rc5_","rc1_","rc1_","rc2_","rc0_","rc7_","rc3_","rc0_","rc5_","rc3_","rc6_","rc3_","rc4_","rc1_","rc4_","rc0_","rc4_","rc5_","rc4_","rc7_","rc4_","rc3_","rc0_","rc1_","rc6_","rc4_","rc2_","rc6_","rc4_","rc7_","rc2_","rc6_","rc7_","rc7_","rc3_","rc6_","rc6_","rc4_","rc7_","rc6_","rc4_","rc4_","rc0_","rc0_","rc6_","rc3_","rc1_","rc3_","rc3_","rc1_","rc4_","rc2_","rc4_","rc3_","rc5_","rc7_","rc5_","rc4_","rc6_","rc3_","rc5_","rc6_","rc4_","rc2_","rc3_","rc3_","rc3_","rc2_","rc1_","rc1_","rc6_","rc5_","rc6_","rc6_","rc1_","rc0_","rc6_","rc7_","rc2_","rc3_","rc5_","rc7_","rc5_","rc1_","rc5_","rc7_","rc7_","rc2_","rc3_","rc1_","rc5_","rc0_","rc0_","rc1_","rc7_","rc6_","rc7_","rc6_","rc7_","rc0_","rc2_","rc5_","rc6_","rc7_","rc2_","rc7_","rc1_","rc3_","rc7_","rc4_","rc7_","rc6_","rc4_","rc0_","rc7_","rc6_","rc7_","rc5_","rc7_","rc3_","rc0_","rc1_","rc0_","rc3_","rc7_","rc2_","rc1_","rc2_"],
|
||||||
|
["rc3_","rc7_","rc0_","rc6_","rc1_","rc0_","rc0_","rc2_","rc1_","rc1_","rc0_","rc0_","rc7_","rc3_","rc0_","rc5_","rc0_","rc3_","rc2_","rc0_","rc3_","rc7_","rc6_","rc3_","rc3_","rc6_","rc5_","rc5_","rc2_","rc0_","rc3_","rc6_","rc0_","rc6_","rc7_","rc5_","rc4_","rc3_","rc5_","rc7_","rc3_","rc3_","rc6_","rc1_","rc7_","rc3_","rc6_","rc7_","rc1_","rc1_","rc6_","rc6_","rc1_","rc5_","rc2_","rc7_","rc5_","rc0_","rc6_","rc5_","rc1_","rc3_","rc5_","rc2_","rc6_","rc4_","rc3_","rc4_","rc6_","rc5_","rc3_","rc6_","rc7_","rc5_","rc3_","rc4_","rc6_","rc4_","rc7_","rc6_","rc5_","rc1_","rc3_","rc1_","rc0_","rc5_","rc5_","rc2_","rc5_","rc5_","rc2_","rc5_","rc3_","rc4_","rc0_","rc5_","rc4_","rc0_","rc3_","rc5_","rc5_","rc6_","rc4_","rc6_","rc5_","rc0_","rc7_","rc2_","rc4_","rc6_","rc4_","rc0_","rc7_","rc3_","rc1_","rc1_","rc1_","rc1_","rc6_","rc3_","rc4_","rc7_","rc0_","rc3_","rc0_","rc2_","rc2_","rc0_","rc3_","rc2_","rc1_","rc6_","rc2_","rc7_","rc7_","rc1_","rc6_","rc3_","rc2_","rc2_","rc3_","rc2_","rc6_","rc7_"],
|
||||||
|
["rc5_","rc7_","rc0_","rc5_","rc4_","rc0_","rc4_","rc1_","rc1_","rc6_","rc2_","rc0_","rc1_","rc5_","rc4_","rc4_","rc2_","rc3_","rc4_","rc0_","rc4_","rc7_","rc4_","rc5_","rc2_","rc7_","rc5_","rc6_","rc0_","rc7_","rc3_","rc0_","rc0_","rc6_","rc1_","rc7_","rc0_","rc3_","rc1_","rc5_","rc5_","rc0_","rc7_","rc4_","rc6_","rc6_","rc7_","rc6_","rc2_","rc2_","rc4_","rc3_","rc4_","rc6_","rc2_","rc3_","rc0_","rc2_","rc6_","rc4_","rc6_","rc5_","rc5_","rc6_","rc7_","rc7_","rc2_","rc5_","rc5_","rc1_","rc4_","rc7_","rc0_","rc7_","rc7_","rc7_","rc6_","rc4_","rc2_","rc1_","rc2_","rc7_","rc1_","rc7_","rc1_","rc5_","rc3_","rc3_","rc1_","rc6_","rc7_","rc6_","rc3_","rc5_","rc2_","rc0_","rc2_","rc2_","rc4_","rc0_","rc4_","rc2_","rc5_","rc7_","rc1_","rc2_","rc2_","rc1_","rc2_","rc7_","rc4_","rc4_","rc3_","rc2_","rc3_","rc3_","rc4_","rc2_","rc6_","rc5_","rc4_","rc3_","rc6_","rc2_","rc7_","rc5_","rc4_","rc5_","rc3_","rc0_","rc0_","rc0_","rc5_","rc7_","rc4_","rc5_","rc1_","rc2_","rc0_","rc1_","rc1_","rc0_","rc7_","rc6_"],
|
||||||
|
["rc5_","rc4_","rc2_","rc1_","rc4_","rc0_","rc3_","rc0_","rc2_","rc7_","rc5_","rc0_","rc3_","rc0_","rc2_","rc6_","rc0_","rc0_","rc5_","rc5_","rc7_","rc6_","rc1_","rc0_","rc7_","rc5_","rc1_","rc0_","rc4_","rc6_","rc2_","rc0_","rc7_","rc4_","rc6_","rc7_","rc2_","rc4_","rc2_","rc5_","rc3_","rc4_","rc2_","rc2_","rc7_","rc3_","rc4_","rc4_","rc1_","rc2_","rc2_","rc7_","rc3_","rc2_","rc4_","rc1_","rc4_","rc5_","rc5_","rc6_","rc2_","rc1_","rc5_","rc2_","rc2_","rc3_","rc7_","rc6_","rc6_","rc0_","rc3_","rc5_","rc6_","rc2_","rc7_","rc6_","rc2_","rc0_","rc2_","rc4_","rc7_","rc7_","rc1_","rc5_","rc0_","rc0_","rc5_","rc0_","rc7_","rc2_","rc4_","rc3_","rc4_","rc2_","rc0_","rc4_","rc5_","rc7_","rc5_","rc6_","rc7_","rc3_","rc6_","rc6_","rc4_","rc7_","rc3_","rc6_","rc5_","rc6_","rc4_","rc1_","rc1_","rc6_","rc1_","rc0_","rc7_","rc2_","rc4_","rc5_","rc1_","rc3_","rc7_","rc7_","rc2_","rc7_","rc3_","rc5_","rc1_","rc2_","rc0_","rc6_","rc6_","rc5_","rc4_","rc0_","rc4_","rc5_","rc6_","rc0_","rc7_","rc6_","rc2_","rc1_"],
|
||||||
|
["rc1_","rc7_","rc2_","rc0_","rc0_","rc7_","rc2_","rc0_","rc1_","rc0_","rc4_","rc1_","rc3_","rc3_","rc6_","rc7_","rc5_","rc4_","rc1_","rc0_","rc2_","rc7_","rc3_","rc5_","rc7_","rc3_","rc7_","rc5_","rc1_","rc7_","rc4_","rc6_","rc4_","rc2_","rc3_","rc5_","rc2_","rc7_","rc5_","rc0_","rc0_","rc1_","rc5_","rc3_","rc0_","rc3_","rc1_","rc0_","rc2_","rc4_","rc6_","rc2_","rc4_","rc0_","rc4_","rc3_","rc4_","rc2_","rc0_","rc4_","rc3_","rc1_","rc2_","rc6_","rc4_","rc0_","rc6_","rc7_","rc5_","rc3_","rc6_","rc7_","rc6_","rc7_","rc0_","rc3_","rc0_","rc1_","rc4_","rc1_","rc0_","rc2_","rc1_","rc5_","rc3_","rc1_","rc0_","rc3_","rc4_","rc1_","rc0_","rc7_","rc4_","rc4_","rc4_","rc2_","rc1_","rc0_","rc2_","rc5_","rc2_","rc2_","rc6_","rc3_","rc2_","rc1_","rc7_","rc2_","rc4_","rc4_","rc7_","rc2_","rc6_","rc6_","rc0_","rc1_","rc0_","rc0_","rc5_","rc6_","rc6_","rc0_","rc7_","rc4_","rc4_","rc1_","rc2_","rc1_","rc3_","rc3_","rc7_","rc0_","rc1_","rc4_","rc3_","rc5_","rc5_","rc7_","rc0_","rc7_","rc3_","rc4_","rc2_","rc2_"],
|
||||||
|
["rc4_","rc0_","rc5_","rc5_","rc3_","rc7_","rc5_","rc1_","rc3_","rc7_","rc6_","rc4_","rc5_","rc7_","rc5_","rc5_","rc0_","rc0_","rc6_","rc1_","rc1_","rc2_","rc7_","rc4_","rc6_","rc2_","rc5_","rc4_","rc6_","rc2_","rc6_","rc3_","rc4_","rc1_","rc7_","rc3_","rc3_","rc5_","rc6_","rc7_","rc3_","rc7_","rc3_","rc7_","rc4_","rc6_","rc3_","rc4_","rc3_","rc7_","rc5_","rc5_","rc3_","rc3_","rc1_","rc2_","rc6_","rc1_","rc4_","rc7_","rc4_","rc5_","rc1_","rc3_","rc3_","rc1_","rc5_","rc1_","rc0_","rc3_","rc2_","rc6_","rc5_","rc7_","rc7_","rc5_","rc4_","rc7_","rc5_","rc0_","rc2_","rc0_","rc5_","rc7_","rc7_","rc7_","rc0_","rc5_","rc5_","rc4_","rc7_","rc1_","rc6_","rc5_","rc5_","rc3_","rc4_","rc6_","rc1_","rc0_","rc3_","rc0_","rc0_","rc0_","rc2_","rc0_","rc2_","rc5_","rc2_","rc1_","rc4_","rc6_","rc5_","rc4_","rc6_","rc6_","rc4_","rc7_","rc6_","rc7_","rc2_","rc3_","rc5_","rc2_","rc4_","rc3_","rc0_","rc3_","rc5_","rc2_","rc2_","rc0_","rc4_","rc4_","rc0_","rc3_","rc1_","rc0_","rc5_","rc1_","rc1_","rc4_","rc6_","rc1_"],
|
||||||
|
["rc6_","rc2_","rc1_","rc1_","rc2_","rc2_","rc2_","rc5_","rc5_","rc7_","rc6_","rc2_","rc5_","rc6_","rc4_","rc3_","rc6_","rc4_","rc0_","rc1_","rc3_","rc0_","rc2_","rc0_","rc3_","rc1_","rc6_","rc7_","rc7_","rc1_","rc5_","rc0_","rc2_","rc2_","rc4_","rc1_","rc2_","rc0_","rc4_","rc2_","rc7_","rc7_","rc2_","rc1_","rc2_","rc6_","rc7_","rc2_","rc0_","rc5_","rc3_","rc2_","rc6_","rc3_","rc6_","rc6_","rc7_","rc3_","rc7_","rc0_","rc4_","rc7_","rc0_","rc2_","rc4_","rc5_","rc1_","rc6_","rc4_","rc1_","rc4_","rc5_","rc0_","rc4_","rc1_","rc6_","rc2_","rc4_","rc3_","rc1_","rc2_","rc4_","rc3_","rc5_","rc0_","rc5_","rc4_","rc7_","rc6_","rc4_","rc6_","rc4_","rc1_","rc6_","rc7_","rc0_","rc1_","rc2_","rc6_","rc0_","rc7_","rc6_","rc2_","rc5_","rc7_","rc5_","rc3_","rc2_","rc6_","rc7_","rc7_","rc1_","rc6_","rc1_","rc0_","rc0_","rc7_","rc6_","rc4_","rc1_","rc0_","rc6_","rc5_","rc2_","rc6_","rc7_","rc1_","rc3_","rc4_","rc1_","rc5_","rc6_","rc4_","rc6_","rc6_","rc4_","rc5_","rc2_","rc0_","rc5_","rc6_","rc7_","rc3_","rc7_"],
|
||||||
|
["rc1_","rc4_","rc2_","rc4_","rc3_","rc7_","rc6_","rc5_","rc4_","rc0_","rc3_","rc4_","rc2_","rc1_","rc0_","rc0_","rc3_","rc3_","rc5_","rc2_","rc2_","rc2_","rc0_","rc0_","rc1_","rc3_","rc1_","rc7_","rc1_","rc5_","rc7_","rc6_","rc6_","rc6_","rc1_","rc1_","rc6_","rc7_","rc2_","rc3_","rc2_","rc3_","rc7_","rc0_","rc6_","rc4_","rc3_","rc2_","rc6_","rc7_","rc5_","rc2_","rc2_","rc0_","rc0_","rc1_","rc4_","rc1_","rc4_","rc0_","rc7_","rc7_","rc3_","rc5_","rc2_","rc6_","rc6_","rc6_","rc5_","rc7_","rc0_","rc3_","rc4_","rc6_","rc3_","rc7_","rc1_","rc0_","rc2_","rc7_","rc6_","rc5_","rc7_","rc7_","rc4_","rc3_","rc7_","rc1_","rc6_","rc3_","rc2_","rc7_","rc1_","rc0_","rc7_","rc3_","rc0_","rc4_","rc7_","rc5_","rc3_","rc5_","rc0_","rc5_","rc7_","rc1_","rc6_","rc1_","rc4_","rc6_","rc5_","rc1_","rc3_","rc5_","rc2_","rc1_","rc7_","rc0_","rc3_","rc7_","rc6_","rc1_","rc4_","rc5_","rc7_","rc5_","rc3_","rc1_","rc6_","rc1_","rc6_","rc4_","rc5_","rc3_","rc3_","rc0_","rc6_","rc5_","rc0_","rc6_","rc7_","rc5_","rc4_","rc6_"],
|
||||||
|
["rc4_","rc0_","rc6_","rc7_","rc3_","rc1_","rc5_","rc2_","rc4_","rc4_","rc0_","rc2_","rc0_","rc0_","rc7_","rc7_","rc4_","rc4_","rc1_","rc4_","rc6_","rc1_","rc7_","rc5_","rc7_","rc1_","rc1_","rc5_","rc1_","rc6_","rc0_","rc7_","rc2_","rc5_","rc3_","rc3_","rc2_","rc5_","rc6_","rc3_","rc1_","rc3_","rc0_","rc6_","rc5_","rc0_","rc3_","rc5_","rc3_","rc5_","rc2_","rc5_","rc4_","rc5_","rc6_","rc4_","rc2_","rc5_","rc1_","rc7_","rc2_","rc7_","rc7_","rc3_","rc4_","rc5_","rc1_","rc3_","rc1_","rc4_","rc4_","rc2_","rc5_","rc6_","rc2_","rc1_","rc5_","rc5_","rc0_","rc3_","rc3_","rc5_","rc7_","rc7_","rc7_","rc1_","rc6_","rc5_","rc0_","rc1_","rc0_","rc5_","rc3_","rc2_","rc2_","rc4_","rc3_","rc7_","rc0_","rc0_","rc3_","rc7_","rc1_","rc7_","rc0_","rc6_","rc0_","rc3_","rc1_","rc0_","rc4_","rc0_","rc3_","rc3_","rc2_","rc1_","rc0_","rc5_","rc1_","rc0_","rc1_","rc6_","rc6_","rc4_","rc4_","rc7_","rc2_","rc0_","rc7_","rc3_","rc1_","rc2_","rc5_","rc5_","rc3_","rc1_","rc0_","rc2_","rc1_","rc3_","rc1_","rc0_","rc0_","rc5_"],
|
||||||
|
["rc4_","rc7_","rc2_","rc4_","rc7_","rc7_","rc6_","rc4_","rc4_","rc3_","rc4_","rc7_","rc4_","rc5_","rc5_","rc1_","rc7_","rc1_","rc2_","rc1_","rc2_","rc6_","rc4_","rc2_","rc0_","rc2_","rc4_","rc2_","rc4_","rc5_","rc5_","rc3_","rc5_","rc2_","rc6_","rc0_","rc3_","rc1_","rc4_","rc2_","rc1_","rc0_","rc0_","rc5_","rc4_","rc4_","rc5_","rc4_","rc3_","rc2_","rc4_","rc4_","rc0_","rc2_","rc3_","rc0_","rc6_","rc7_","rc3_","rc0_","rc2_","rc0_","rc1_","rc7_","rc7_","rc3_","rc0_","rc5_","rc5_","rc2_","rc5_","rc3_","rc2_","rc6_","rc3_","rc5_","rc4_","rc4_","rc0_","rc4_","rc5_","rc5_","rc0_","rc5_","rc7_","rc2_","rc0_","rc4_","rc2_","rc0_","rc5_","rc5_","rc5_","rc0_","rc6_","rc4_","rc1_","rc2_","rc7_","rc3_","rc4_","rc3_","rc0_","rc4_","rc5_","rc4_","rc6_","rc0_","rc3_","rc5_","rc0_","rc0_","rc2_","rc2_","rc4_","rc2_","rc0_","rc5_","rc3_","rc6_","rc5_","rc5_","rc2_","rc0_","rc2_","rc5_","rc3_","rc1_","rc4_","rc7_","rc3_","rc2_","rc1_","rc3_","rc5_","rc0_","rc2_","rc2_","rc7_","rc6_","rc1_","rc0_","rc3_","rc7_"],
|
||||||
|
["rc5_","rc2_","rc2_","rc4_","rc3_","rc4_","rc4_","rc5_","rc7_","rc6_","rc2_","rc3_","rc4_","rc0_","rc7_","rc5_","rc0_","rc3_","rc4_","rc1_","rc3_","rc2_","rc4_","rc6_","rc2_","rc1_","rc0_","rc7_","rc7_","rc5_","rc3_","rc2_","rc3_","rc4_","rc0_","rc2_","rc7_","rc6_","rc3_","rc3_","rc7_","rc4_","rc5_","rc4_","rc1_","rc0_","rc4_","rc1_","rc4_","rc5_","rc2_","rc1_","rc3_","rc0_","rc5_","rc5_","rc4_","rc0_","rc7_","rc3_","rc5_","rc2_","rc7_","rc2_","rc7_","rc0_","rc0_","rc6_","rc5_","rc3_","rc0_","rc6_","rc6_","rc6_","rc3_","rc4_","rc1_","rc5_","rc1_","rc5_","rc1_","rc6_","rc6_","rc2_","rc1_","rc6_","rc0_","rc6_","rc1_","rc7_","rc6_","rc1_","rc2_","rc1_","rc7_","rc4_","rc7_","rc7_","rc1_","rc6_","rc4_","rc3_","rc3_","rc7_","rc3_","rc5_","rc5_","rc3_","rc5_","rc7_","rc6_","rc1_","rc6_","rc5_","rc6_","rc4_","rc4_","rc3_","rc5_","rc1_","rc1_","rc7_","rc4_","rc2_","rc7_","rc1_","rc3_","rc3_","rc3_","rc0_","rc2_","rc4_","rc5_","rc7_","rc4_","rc6_","rc7_","rc7_","rc1_","rc1_","rc5_","rc7_","rc3_","rc4_"],
|
||||||
|
["rc4_","rc2_","rc3_","rc6_","rc5_","rc0_","rc5_","rc6_","rc3_","rc7_","rc1_","rc6_","rc3_","rc3_","rc3_","rc6_","rc4_","rc3_","rc5_","rc6_","rc0_","rc6_","rc3_","rc2_","rc2_","rc6_","rc0_","rc5_","rc0_","rc4_","rc0_","rc0_","rc2_","rc5_","rc5_","rc2_","rc3_","rc4_","rc6_","rc4_","rc0_","rc7_","rc4_","rc5_","rc7_","rc6_","rc7_","rc4_","rc2_","rc1_","rc1_","rc4_","rc4_","rc1_","rc1_","rc5_","rc3_","rc2_","rc3_","rc0_","rc6_","rc7_","rc5_","rc3_","rc1_","rc7_","rc5_","rc6_","rc7_","rc7_","rc1_","rc5_","rc7_","rc0_","rc7_","rc7_","rc2_","rc2_","rc7_","rc6_","rc4_","rc0_","rc6_","rc0_","rc1_","rc6_","rc4_","rc5_","rc3_","rc1_","rc0_","rc2_","rc1_","rc7_","rc2_","rc6_","rc1_","rc7_","rc1_","rc3_","rc0_","rc1_","rc7_","rc7_","rc1_","rc0_","rc1_","rc3_","rc5_","rc7_","rc3_","rc4_","rc3_","rc3_","rc4_","rc0_","rc1_","rc7_","rc6_","rc3_","rc1_","rc5_","rc1_","rc3_","rc6_","rc4_","rc7_","rc1_","rc1_","rc5_","rc3_","rc1_","rc7_","rc3_","rc6_","rc3_","rc6_","rc1_","rc3_","rc3_","rc0_","rc6_","rc4_","rc6_"],
|
||||||
|
["rc6_","rc7_","rc3_","rc6_","rc1_","rc4_","rc5_","rc7_","rc5_","rc6_","rc4_","rc3_","rc0_","rc6_","rc5_","rc3_","rc1_","rc2_","rc2_","rc0_","rc4_","rc4_","rc0_","rc1_","rc5_","rc3_","rc3_","rc5_","rc2_","rc6_","rc0_","rc3_","rc6_","rc6_","rc3_","rc0_","rc4_","rc3_","rc3_","rc1_","rc1_","rc2_","rc3_","rc2_","rc5_","rc6_","rc2_","rc6_","rc3_","rc5_","rc5_","rc7_","rc6_","rc4_","rc3_","rc0_","rc6_","rc5_","rc2_","rc2_","rc4_","rc7_","rc0_","rc4_","rc3_","rc7_","rc4_","rc7_","rc7_","rc6_","rc6_","rc0_","rc3_","rc3_","rc5_","rc7_","rc5_","rc3_","rc7_","rc0_","rc4_","rc6_","rc6_","rc7_","rc5_","rc3_","rc1_","rc2_","rc2_","rc7_","rc0_","rc2_","rc5_","rc2_","rc5_","rc2_","rc4_","rc2_","rc7_","rc2_","rc5_","rc5_","rc0_","rc6_","rc3_","rc0_","rc1_","rc3_","rc1_","rc5_","rc5_","rc2_","rc7_","rc5_","rc4_","rc1_","rc3_","rc2_","rc1_","rc5_","rc1_","rc1_","rc5_","rc4_","rc6_","rc6_","rc5_","rc3_","rc1_","rc0_","rc2_","rc3_","rc4_","rc6_","rc0_","rc1_","rc2_","rc2_","rc1_","rc6_","rc1_","rc5_","rc2_","rc4_"],
|
||||||
|
["rc1_","rc3_","rc7_","rc2_","rc5_","rc1_","rc3_","rc2_","rc2_","rc4_","rc2_","rc1_","rc6_","rc3_","rc2_","rc7_","rc4_","rc0_","rc6_","rc0_","rc4_","rc3_","rc6_","rc2_","rc0_","rc0_","rc4_","rc0_","rc4_","rc2_","rc0_","rc6_","rc5_","rc7_","rc6_","rc5_","rc6_","rc6_","rc6_","rc1_","rc6_","rc7_","rc5_","rc2_","rc6_","rc2_","rc2_","rc0_","rc2_","rc2_","rc4_","rc2_","rc7_","rc3_","rc2_","rc1_","rc4_","rc2_","rc2_","rc0_","rc3_","rc4_","rc6_","rc7_","rc1_","rc2_","rc3_","rc1_","rc4_","rc3_","rc4_","rc2_","rc5_","rc2_","rc0_","rc5_","rc6_","rc2_","rc7_","rc4_","rc6_","rc7_","rc2_","rc1_","rc2_","rc7_","rc4_","rc5_","rc6_","rc1_","rc3_","rc0_","rc5_","rc4_","rc3_","rc0_","rc5_","rc3_","rc6_","rc5_","rc7_","rc7_","rc4_","rc4_","rc6_","rc6_","rc1_","rc2_","rc5_","rc3_","rc0_","rc5_","rc5_","rc6_","rc2_","rc5_","rc7_","rc6_","rc4_","rc0_","rc0_","rc3_","rc7_","rc6_","rc3_","rc1_","rc1_","rc2_","rc3_","rc2_","rc5_","rc2_","rc0_","rc3_","rc6_","rc1_","rc1_","rc2_","rc2_","rc3_","rc4_","rc6_","rc5_","rc1_"],
|
||||||
|
["rc2_","rc7_","rc3_","rc6_","rc6_","rc0_","rc2_","rc0_","rc7_","rc2_","rc6_","rc3_","rc4_","rc3_","rc7_","rc2_","rc0_","rc7_","rc1_","rc0_","rc7_","rc5_","rc3_","rc7_","rc7_","rc6_","rc2_","rc7_","rc2_","rc1_","rc6_","rc0_","rc3_","rc3_","rc4_","rc3_","rc7_","rc5_","rc6_","rc6_","rc6_","rc6_","rc1_","rc7_","rc1_","rc2_","rc5_","rc3_","rc7_","rc3_","rc2_","rc7_","rc3_","rc0_","rc1_","rc7_","rc0_","rc3_","rc0_","rc5_","rc0_","rc7_","rc3_","rc4_","rc0_","rc1_","rc7_","rc5_","rc0_","rc6_","rc0_","rc2_","rc3_","rc6_","rc6_","rc1_","rc2_","rc7_","rc3_","rc4_","rc5_","rc5_","rc0_","rc7_","rc4_","rc1_","rc1_","rc1_","rc3_","rc0_","rc6_","rc6_","rc5_","rc5_","rc4_","rc4_","rc2_","rc1_","rc3_","rc4_","rc4_","rc2_","rc0_","rc4_","rc6_","rc2_","rc6_","rc3_","rc6_","rc1_","rc1_","rc4_","rc5_","rc6_","rc4_","rc7_","rc4_","rc2_","rc3_","rc4_","rc1_","rc5_","rc3_","rc2_","rc2_","rc5_","rc1_","rc7_","rc1_","rc4_","rc0_","rc0_","rc1_","rc1_","rc7_","rc3_","rc0_","rc2_","rc2_","rc3_","rc6_","rc1_","rc7_","rc4_"],
|
||||||
|
["rc5_","rc4_","rc4_","rc0_","rc1_","rc2_","rc0_","rc2_","rc1_","rc2_","rc7_","rc0_","rc6_","rc6_","rc2_","rc6_","rc4_","rc0_","rc6_","rc1_","rc0_","rc4_","rc3_","rc0_","rc1_","rc7_","rc0_","rc2_","rc1_","rc6_","rc5_","rc4_","rc5_","rc1_","rc2_","rc2_","rc3_","rc1_","rc6_","rc1_","rc4_","rc0_","rc2_","rc2_","rc2_","rc1_","rc7_","rc1_","rc4_","rc0_","rc5_","rc6_","rc0_","rc2_","rc6_","rc4_","rc0_","rc0_","rc2_","rc0_","rc0_","rc0_","rc4_","rc4_","rc6_","rc5_","rc4_","rc5_","rc3_","rc0_","rc7_","rc2_","rc1_","rc6_","rc4_","rc6_","rc6_","rc4_","rc0_","rc0_","rc0_","rc1_","rc5_","rc0_","rc1_","rc3_","rc6_","rc4_","rc6_","rc5_","rc6_","rc5_","rc2_","rc7_","rc2_","rc4_","rc0_","rc6_","rc4_","rc1_","rc0_","rc6_","rc1_","rc5_","rc1_","rc5_","rc5_","rc5_","rc1_","rc1_","rc6_","rc2_","rc1_","rc5_","rc6_","rc7_","rc5_","rc0_","rc5_","rc3_","rc2_","rc7_","rc6_","rc0_","rc0_","rc4_","rc0_","rc3_","rc2_","rc6_","rc0_","rc5_","rc3_","rc3_","rc6_","rc1_","rc4_","rc4_","rc5_","rc7_","rc4_","rc0_","rc7_","rc0_"],
|
||||||
|
["rc7_","rc3_","rc0_","rc3_","rc2_","rc0_","rc1_","rc0_","rc5_","rc5_","rc1_","rc3_","rc1_","rc6_","rc7_","rc2_","rc5_","rc4_","rc2_","rc3_","rc4_","rc0_","rc4_","rc0_","rc1_","rc3_","rc5_","rc4_","rc6_","rc7_","rc4_","rc3_","rc1_","rc3_","rc3_","rc4_","rc0_","rc3_","rc4_","rc2_","rc6_","rc7_","rc6_","rc4_","rc7_","rc5_","rc5_","rc2_","rc0_","rc1_","rc1_","rc1_","rc2_","rc4_","rc5_","rc0_","rc1_","rc2_","rc3_","rc4_","rc0_","rc0_","rc6_","rc1_","rc7_","rc6_","rc0_","rc2_","rc0_","rc2_","rc5_","rc2_","rc6_","rc5_","rc7_","rc4_","rc7_","rc2_","rc4_","rc0_","rc4_","rc4_","rc5_","rc0_","rc6_","rc7_","rc0_","rc2_","rc3_","rc2_","rc0_","rc6_","rc1_","rc3_","rc3_","rc2_","rc3_","rc3_","rc5_","rc4_","rc2_","rc4_","rc4_","rc0_","rc5_","rc0_","rc3_","rc3_","rc3_","rc4_","rc2_","rc7_","rc0_","rc5_","rc6_","rc7_","rc7_","rc1_","rc5_","rc6_","rc0_","rc2_","rc5_","rc3_","rc2_","rc6_","rc5_","rc0_","rc2_","rc2_","rc4_","rc3_","rc5_","rc1_","rc1_","rc4_","rc2_","rc7_","rc2_","rc0_","rc3_","rc3_","rc1_","rc6_"],
|
||||||
|
["rc5_","rc5_","rc4_","rc0_","rc6_","rc3_","rc4_","rc4_","rc7_","rc2_","rc0_","rc3_","rc3_","rc3_","rc3_","rc1_","rc7_","rc4_","rc3_","rc7_","rc1_","rc1_","rc4_","rc6_","rc6_","rc3_","rc4_","rc5_","rc6_","rc0_","rc0_","rc4_","rc3_","rc2_","rc7_","rc1_","rc3_","rc4_","rc5_","rc3_","rc1_","rc3_","rc3_","rc6_","rc3_","rc2_","rc5_","rc7_","rc7_","rc0_","rc4_","rc0_","rc7_","rc5_","rc5_","rc5_","rc0_","rc3_","rc1_","rc0_","rc5_","rc2_","rc6_","rc2_","rc1_","rc6_","rc7_","rc3_","rc5_","rc5_","rc0_","rc4_","rc6_","rc4_","rc4_","rc3_","rc3_","rc1_","rc2_","rc0_","rc5_","rc6_","rc5_","rc5_","rc7_","rc4_","rc4_","rc2_","rc1_","rc7_","rc1_","rc2_","rc0_","rc1_","rc5_","rc0_","rc0_","rc1_","rc4_","rc6_","rc4_","rc5_","rc5_","rc0_","rc5_","rc5_","rc5_","rc4_","rc2_","rc2_","rc4_","rc4_","rc7_","rc7_","rc0_","rc0_","rc1_","rc7_","rc1_","rc5_","rc0_","rc7_","rc5_","rc3_","rc6_","rc5_","rc4_","rc6_","rc7_","rc2_","rc6_","rc2_","rc1_","rc4_","rc4_","rc5_","rc7_","rc7_","rc5_","rc7_","rc0_","rc4_","rc2_","rc5_"],
|
||||||
|
["rc5_","rc2_","rc4_","rc7_","rc4_","rc5_","rc4_","rc6_","rc6_","rc4_","rc3_","rc2_","rc7_","rc7_","rc3_","rc3_","rc7_","rc1_","rc6_","rc7_","rc4_","rc2_","rc5_","rc3_","rc3_","rc0_","rc4_","rc5_","rc7_","rc0_","rc4_","rc2_","rc0_","rc7_","rc1_","rc3_","rc0_","rc6_","rc5_","rc5_","rc2_","rc5_","rc4_","rc1_","rc4_","rc6_","rc2_","rc1_","rc7_","rc6_","rc2_","rc4_","rc4_","rc0_","rc1_","rc4_","rc2_","rc3_","rc2_","rc6_","rc5_","rc4_","rc2_","rc2_","rc0_","rc7_","rc7_","rc4_","rc6_","rc2_","rc5_","rc1_","rc5_","rc2_","rc1_","rc6_","rc5_","rc3_","rc1_","rc6_","rc0_","rc2_","rc3_","rc2_","rc2_","rc5_","rc6_","rc6_","rc3_","rc5_","rc7_","rc2_","rc2_","rc3_","rc4_","rc6_","rc4_","rc1_","rc6_","rc1_","rc6_","rc2_","rc2_","rc4_","rc7_","rc4_","rc0_","rc2_","rc1_","rc5_","rc0_","rc3_","rc2_","rc4_","rc2_","rc1_","rc6_","rc1_","rc5_","rc3_","rc7_","rc0_","rc3_","rc0_","rc7_","rc2_","rc3_","rc6_","rc5_","rc5_","rc6_","rc4_","rc7_","rc5_","rc5_","rc4_","rc7_","rc2_","rc3_","rc5_","rc1_","rc4_","rc0_","rc0_"],
|
||||||
|
["rc4_","rc4_","rc5_","rc1_","rc6_","rc5_","rc7_","rc1_","rc5_","rc3_","rc6_","rc2_","rc4_","rc3_","rc5_","rc2_","rc2_","rc3_","rc7_","rc3_","rc2_","rc3_","rc7_","rc2_","rc6_","rc4_","rc0_","rc7_","rc4_","rc0_","rc7_","rc4_","rc6_","rc3_","rc6_","rc2_","rc5_","rc0_","rc3_","rc0_","rc6_","rc7_","rc0_","rc6_","rc0_","rc5_","rc3_","rc1_","rc4_","rc4_","rc1_","rc7_","rc6_","rc5_","rc7_","rc5_","rc3_","rc3_","rc1_","rc7_","rc3_","rc2_","rc6_","rc1_","rc1_","rc0_","rc4_","rc3_","rc1_","rc2_","rc0_","rc2_","rc2_","rc2_","rc1_","rc5_","rc4_","rc0_","rc6_","rc4_","rc3_","rc7_","rc4_","rc0_","rc4_","rc2_","rc4_","rc7_","rc7_","rc6_","rc5_","rc7_","rc6_","rc1_","rc6_","rc5_","rc5_","rc3_","rc6_","rc6_","rc3_","rc4_","rc0_","rc5_","rc0_","rc6_","rc1_","rc6_","rc7_","rc5_","rc4_","rc4_","rc6_","rc4_","rc0_","rc6_","rc3_","rc2_","rc0_","rc6_","rc1_","rc5_","rc3_","rc5_","rc4_","rc5_","rc5_","rc1_","rc2_","rc5_","rc6_","rc1_","rc2_","rc5_","rc2_","rc3_","rc1_","rc3_","rc0_","rc3_","rc2_","rc3_","rc7_","rc7_"],
|
||||||
|
["rc5_","rc4_","rc6_","rc0_","rc4_","rc5_","rc2_","rc4_","rc2_","rc1_","rc5_","rc2_","rc5_","rc7_","rc5_","rc5_","rc6_","rc4_","rc3_","rc5_","rc7_","rc5_","rc5_","rc2_","rc4_","rc0_","rc7_","rc2_","rc4_","rc2_","rc5_","rc5_","rc2_","rc6_","rc4_","rc7_","rc7_","rc4_","rc2_","rc7_","rc2_","rc1_","rc2_","rc5_","rc3_","rc6_","rc4_","rc1_","rc4_","rc3_","rc5_","rc1_","rc1_","rc5_","rc3_","rc3_","rc2_","rc5_","rc4_","rc4_","rc6_","rc3_","rc0_","rc0_","rc2_","rc3_","rc3_","rc4_","rc3_","rc7_","rc7_","rc7_","rc0_","rc5_","rc2_","rc0_","rc3_","rc2_","rc4_","rc4_","rc2_","rc7_","rc4_","rc7_","rc1_","rc3_","rc3_","rc5_","rc2_","rc2_","rc1_","rc1_","rc0_","rc5_","rc6_","rc6_","rc0_","rc1_","rc4_","rc5_","rc0_","rc4_","rc3_","rc6_","rc5_","rc5_","rc5_","rc1_","rc0_","rc4_","rc4_","rc7_","rc0_","rc2_","rc0_","rc5_","rc6_","rc2_","rc5_","rc2_","rc5_","rc0_","rc4_","rc1_","rc1_","rc0_","rc1_","rc1_","rc1_","rc2_","rc6_","rc2_","rc0_","rc5_","rc5_","rc2_","rc0_","rc2_","rc3_","rc2_","rc0_","rc3_","rc4_","rc3_"],
|
||||||
|
["rc0_","rc3_","rc1_","rc4_","rc1_","rc7_","rc1_","rc0_","rc3_","rc6_","rc7_","rc4_","rc1_","rc5_","rc0_","rc7_","rc0_","rc5_","rc0_","rc5_","rc0_","rc1_","rc6_","rc5_","rc2_","rc3_","rc4_","rc1_","rc3_","rc7_","rc3_","rc5_","rc7_","rc2_","rc7_","rc4_","rc2_","rc4_","rc7_","rc0_","rc3_","rc4_","rc1_","rc1_","rc2_","rc2_","rc3_","rc0_","rc3_","rc3_","rc4_","rc4_","rc3_","rc0_","rc4_","rc5_","rc2_","rc1_","rc1_","rc7_","rc2_","rc0_","rc3_","rc0_","rc7_","rc0_","rc3_","rc5_","rc0_","rc0_","rc0_","rc2_","rc5_","rc2_","rc1_","rc2_","rc1_","rc2_","rc2_","rc6_","rc2_","rc3_","rc1_","rc0_","rc7_","rc3_","rc0_","rc3_","rc1_","rc2_","rc0_","rc3_","rc5_","rc7_","rc3_","rc3_","rc0_","rc4_","rc3_","rc7_","rc4_","rc3_","rc2_","rc6_","rc3_","rc1_","rc1_","rc5_","rc1_","rc2_","rc5_","rc0_","rc6_","rc5_","rc6_","rc1_","rc4_","rc1_","rc2_","rc6_","rc7_","rc0_","rc2_","rc7_","rc3_","rc3_","rc3_","rc5_","rc2_","rc7_","rc0_","rc1_","rc5_","rc6_","rc6_","rc4_","rc2_","rc0_","rc0_","rc2_","rc0_","rc4_","rc4_","rc5_"],
|
||||||
|
["rc7_","rc2_","rc5_","rc7_","rc3_","rc3_","rc3_","rc0_","rc3_","rc3_","rc0_","rc1_","rc4_","rc5_","rc3_","rc7_","rc4_","rc7_","rc3_","rc5_","rc4_","rc0_","rc4_","rc3_","rc5_","rc0_","rc6_","rc3_","rc6_","rc7_","rc7_","rc6_","rc4_","rc1_","rc5_","rc2_","rc4_","rc7_","rc1_","rc7_","rc5_","rc1_","rc0_","rc2_","rc2_","rc4_","rc4_","rc1_","rc6_","rc6_","rc2_","rc1_","rc0_","rc2_","rc5_","rc4_","rc1_","rc0_","rc3_","rc7_","rc4_","rc3_","rc6_","rc3_","rc6_","rc2_","rc6_","rc1_","rc6_","rc7_","rc5_","rc4_","rc6_","rc4_","rc4_","rc2_","rc2_","rc0_","rc4_","rc3_","rc1_","rc4_","rc7_","rc5_","rc2_","rc2_","rc7_","rc7_","rc1_","rc0_","rc7_","rc5_","rc2_","rc1_","rc2_","rc4_","rc4_","rc5_","rc0_","rc6_","rc2_","rc3_","rc0_","rc7_","rc6_","rc4_","rc2_","rc1_","rc7_","rc1_","rc4_","rc5_","rc5_","rc7_","rc0_","rc3_","rc2_","rc2_","rc4_","rc4_","rc3_","rc0_","rc2_","rc6_","rc7_","rc0_","rc1_","rc0_","rc7_","rc3_","rc4_","rc7_","rc7_","rc1_","rc1_","rc0_","rc4_","rc7_","rc4_","rc6_","rc7_","rc0_","rc5_","rc6_"],
|
||||||
|
["rc1_","rc1_","rc7_","rc2_","rc7_","rc1_","rc3_","rc3_","rc0_","rc1_","rc4_","rc2_","rc3_","rc1_","rc4_","rc0_","rc7_","rc3_","rc0_","rc5_","rc6_","rc3_","rc7_","rc6_","rc1_","rc7_","rc1_","rc2_","rc2_","rc4_","rc5_","rc0_","rc6_","rc2_","rc3_","rc1_","rc1_","rc0_","rc3_","rc3_","rc7_","rc2_","rc6_","rc1_","rc0_","rc2_","rc4_","rc5_","rc3_","rc6_","rc5_","rc7_","rc6_","rc1_","rc4_","rc3_","rc5_","rc3_","rc0_","rc6_","rc1_","rc5_","rc5_","rc1_","rc3_","rc0_","rc4_","rc1_","rc1_","rc6_","rc6_","rc5_","rc0_","rc4_","rc6_","rc2_","rc4_","rc5_","rc7_","rc5_","rc3_","rc2_","rc3_","rc7_","rc0_","rc1_","rc7_","rc5_","rc7_","rc4_","rc3_","rc0_","rc4_","rc4_","rc6_","rc1_","rc1_","rc5_","rc1_","rc2_","rc7_","rc3_","rc3_","rc2_","rc5_","rc5_","rc5_","rc7_","rc7_","rc2_","rc7_","rc0_","rc1_","rc1_","rc3_","rc3_","rc4_","rc5_","rc7_","rc5_","rc7_","rc1_","rc1_","rc0_","rc2_","rc0_","rc7_","rc2_","rc7_","rc0_","rc4_","rc4_","rc3_","rc0_","rc2_","rc7_","rc3_","rc7_","rc4_","rc6_","rc2_","rc7_","rc2_","rc0_"],
|
||||||
|
["rc2_","rc3_","rc3_","rc4_","rc1_","rc4_","rc6_","rc3_","rc6_","rc2_","rc2_","rc0_","rc4_","rc1_","rc7_","rc3_","rc6_","rc2_","rc4_","rc6_","rc3_","rc4_","rc3_","rc7_","rc5_","rc2_","rc1_","rc0_","rc4_","rc6_","rc2_","rc3_","rc1_","rc6_","rc5_","rc2_","rc7_","rc7_","rc3_","rc6_","rc4_","rc0_","rc6_","rc6_","rc1_","rc0_","rc0_","rc3_","rc6_","rc1_","rc1_","rc1_","rc2_","rc7_","rc6_","rc1_","rc1_","rc4_","rc6_","rc5_","rc7_","rc6_","rc6_","rc3_","rc3_","rc4_","rc7_","rc5_","rc0_","rc5_","rc6_","rc0_","rc0_","rc1_","rc5_","rc4_","rc2_","rc4_","rc1_","rc3_","rc6_","rc0_","rc4_","rc6_","rc6_","rc1_","rc3_","rc4_","rc7_","rc7_","rc2_","rc4_","rc0_","rc0_","rc6_","rc6_","rc3_","rc5_","rc3_","rc5_","rc1_","rc6_","rc7_","rc7_","rc3_","rc7_","rc7_","rc0_","rc6_","rc5_","rc2_","rc3_","rc7_","rc4_","rc3_","rc3_","rc7_","rc3_","rc2_","rc1_","rc0_","rc3_","rc4_","rc7_","rc1_","rc3_","rc2_","rc4_","rc7_","rc7_","rc0_","rc1_","rc5_","rc2_","rc7_","rc4_","rc4_","rc2_","rc5_","rc2_","rc6_","rc3_","rc3_","rc3_"],
|
||||||
|
["rc0_","rc7_","rc7_","rc0_","rc7_","rc4_","rc3_","rc0_","rc4_","rc6_","rc6_","rc4_","rc2_","rc7_","rc2_","rc7_","rc7_","rc4_","rc5_","rc2_","rc2_","rc2_","rc4_","rc7_","rc4_","rc1_","rc5_","rc4_","rc2_","rc7_","rc4_","rc2_","rc2_","rc0_","rc0_","rc7_","rc3_","rc5_","rc6_","rc1_","rc2_","rc2_","rc7_","rc4_","rc3_","rc5_","rc6_","rc6_","rc4_","rc3_","rc4_","rc0_","rc0_","rc5_","rc7_","rc7_","rc3_","rc4_","rc0_","rc5_","rc1_","rc0_","rc5_","rc2_","rc4_","rc7_","rc7_","rc6_","rc6_","rc4_","rc4_","rc3_","rc3_","rc6_","rc7_","rc7_","rc2_","rc3_","rc6_","rc0_","rc6_","rc5_","rc4_","rc3_","rc0_","rc3_","rc0_","rc6_","rc0_","rc3_","rc7_","rc4_","rc4_","rc7_","rc6_","rc1_","rc7_","rc5_","rc2_","rc7_","rc5_","rc3_","rc3_","rc0_","rc6_","rc3_","rc6_","rc5_","rc2_","rc3_","rc2_","rc6_","rc4_","rc1_","rc5_","rc3_","rc2_","rc5_","rc0_","rc2_","rc3_","rc7_","rc0_","rc2_","rc2_","rc2_","rc7_","rc0_","rc3_","rc1_","rc2_","rc0_","rc3_","rc2_","rc4_","rc6_","rc4_","rc0_","rc4_","rc5_","rc1_","rc5_","rc2_","rc0_"],
|
||||||
|
["rc7_","rc7_","rc7_","rc7_","rc5_","rc2_","rc5_","rc4_","rc6_","rc7_","rc5_","rc7_","rc4_","rc4_","rc0_","rc7_","rc7_","rc3_","rc0_","rc2_","rc6_","rc7_","rc0_","rc6_","rc5_","rc5_","rc1_","rc0_","rc7_","rc0_","rc6_","rc6_","rc6_","rc7_","rc2_","rc0_","rc2_","rc2_","rc1_","rc4_","rc6_","rc3_","rc4_","rc3_","rc1_","rc2_","rc1_","rc5_","rc3_","rc4_","rc3_","rc4_","rc6_","rc4_","rc5_","rc0_","rc0_","rc2_","rc5_","rc6_","rc6_","rc4_","rc7_","rc7_","rc2_","rc2_","rc6_","rc6_","rc0_","rc6_","rc2_","rc2_","rc6_","rc4_","rc7_","rc5_","rc2_","rc6_","rc3_","rc4_","rc0_","rc3_","rc2_","rc0_","rc4_","rc1_","rc5_","rc4_","rc5_","rc0_","rc0_","rc7_","rc3_","rc1_","rc3_","rc4_","rc3_","rc7_","rc4_","rc1_","rc0_","rc5_","rc2_","rc6_","rc4_","rc1_","rc5_","rc6_","rc7_","rc7_","rc4_","rc2_","rc6_","rc0_","rc7_","rc4_","rc0_","rc4_","rc7_","rc1_","rc5_","rc6_","rc2_","rc3_","rc1_","rc0_","rc3_","rc6_","rc0_","rc7_","rc2_","rc1_","rc1_","rc7_","rc0_","rc7_","rc0_","rc2_","rc6_","rc7_","rc7_","rc5_","rc6_","rc0_"],
|
||||||
|
["rc4_","rc4_","rc1_","rc1_","rc1_","rc7_","rc2_","rc0_","rc0_","rc4_","rc4_","rc2_","rc5_","rc0_","rc0_","rc3_","rc1_","rc0_","rc1_","rc5_","rc4_","rc5_","rc4_","rc6_","rc3_","rc7_","rc1_","rc5_","rc2_","rc1_","rc7_","rc6_","rc3_","rc6_","rc0_","rc7_","rc0_","rc1_","rc0_","rc1_","rc5_","rc3_","rc4_","rc3_","rc2_","rc1_","rc0_","rc3_","rc0_","rc4_","rc2_","rc7_","rc1_","rc6_","rc5_","rc3_","rc4_","rc1_","rc0_","rc3_","rc1_","rc2_","rc1_","rc4_","rc3_","rc6_","rc4_","rc6_","rc4_","rc3_","rc0_","rc4_","rc5_","rc2_","rc3_","rc7_","rc6_","rc4_","rc5_","rc0_","rc2_","rc3_","rc3_","rc5_","rc7_","rc2_","rc5_","rc6_","rc5_","rc7_","rc2_","rc0_","rc4_","rc0_","rc2_","rc1_","rc3_","rc4_","rc5_","rc5_","rc6_","rc4_","rc2_","rc1_","rc0_","rc2_","rc2_","rc6_","rc1_","rc0_","rc6_","rc0_","rc2_","rc3_","rc6_","rc0_","rc7_","rc1_","rc3_","rc6_","rc3_","rc2_","rc7_","rc3_","rc2_","rc4_","rc4_","rc6_","rc3_","rc1_","rc3_","rc6_","rc5_","rc4_","rc6_","rc7_","rc5_","rc1_","rc7_","rc0_","rc4_","rc5_","rc3_","rc5_"],
|
||||||
|
["rc5_","rc6_","rc1_","rc0_","rc0_","rc4_","rc7_","rc5_","rc0_","rc1_","rc7_","rc5_","rc4_","rc4_","rc6_","rc4_","rc4_","rc4_","rc6_","rc7_","rc2_","rc3_","rc4_","rc0_","rc4_","rc1_","rc4_","rc5_","rc7_","rc3_","rc3_","rc5_","rc6_","rc4_","rc6_","rc4_","rc3_","rc2_","rc1_","rc1_","rc4_","rc4_","rc3_","rc6_","rc2_","rc3_","rc0_","rc1_","rc6_","rc6_","rc6_","rc1_","rc5_","rc2_","rc4_","rc2_","rc6_","rc1_","rc0_","rc4_","rc1_","rc3_","rc0_","rc0_","rc3_","rc3_","rc3_","rc6_","rc7_","rc4_","rc2_","rc3_","rc7_","rc3_","rc1_","rc6_","rc3_","rc6_","rc2_","rc5_","rc0_","rc5_","rc3_","rc4_","rc5_","rc0_","rc6_","rc6_","rc3_","rc2_","rc3_","rc6_","rc3_","rc4_","rc1_","rc0_","rc4_","rc5_","rc2_","rc4_","rc5_","rc1_","rc0_","rc3_","rc0_","rc7_","rc2_","rc5_","rc7_","rc7_","rc4_","rc2_","rc3_","rc3_","rc6_","rc7_","rc3_","rc6_","rc3_","rc4_","rc2_","rc3_","rc4_","rc3_","rc4_","rc7_","rc6_","rc4_","rc2_","rc1_","rc2_","rc7_","rc4_","rc1_","rc4_","rc1_","rc7_","rc7_","rc6_","rc2_","rc7_","rc5_","rc6_","rc6_"],
|
||||||
|
["rc7_","rc0_","rc5_","rc4_","rc6_","rc3_","rc1_","rc3_","rc4_","rc4_","rc5_","rc3_","rc5_","rc3_","rc7_","rc3_","rc5_","rc0_","rc3_","rc7_","rc5_","rc4_","rc6_","rc4_","rc5_","rc3_","rc6_","rc7_","rc3_","rc1_","rc0_","rc2_","rc3_","rc3_","rc1_","rc1_","rc7_","rc7_","rc1_","rc5_","rc0_","rc6_","rc5_","rc6_","rc6_","rc0_","rc4_","rc6_","rc4_","rc1_","rc5_","rc3_","rc0_","rc3_","rc7_","rc5_","rc2_","rc4_","rc0_","rc2_","rc2_","rc1_","rc2_","rc6_","rc7_","rc4_","rc3_","rc7_","rc5_","rc2_","rc4_","rc0_","rc7_","rc7_","rc4_","rc3_","rc6_","rc6_","rc6_","rc5_","rc0_","rc4_","rc0_","rc5_","rc4_","rc5_","rc5_","rc5_","rc5_","rc1_","rc6_","rc4_","rc5_","rc0_","rc4_","rc2_","rc4_","rc3_","rc1_","rc6_","rc1_","rc5_","rc0_","rc5_","rc0_","rc2_","rc2_","rc4_","rc5_","rc6_","rc3_","rc0_","rc0_","rc1_","rc4_","rc3_","rc2_","rc2_","rc2_","rc2_","rc7_","rc2_","rc6_","rc4_","rc3_","rc3_","rc7_","rc6_","rc2_","rc0_","rc5_","rc5_","rc3_","rc7_","rc7_","rc4_","rc4_","rc4_","rc7_","rc7_","rc4_","rc7_","rc4_","rc6_"],
|
||||||
|
["rc5_","rc1_","rc1_","rc6_","rc1_","rc3_","rc4_","rc4_","rc7_","rc0_","rc2_","rc4_","rc5_","rc4_","rc1_","rc1_","rc0_","rc4_","rc6_","rc6_","rc2_","rc0_","rc7_","rc4_","rc3_","rc7_","rc4_","rc5_","rc3_","rc1_","rc2_","rc0_","rc7_","rc3_","rc7_","rc6_","rc2_","rc7_","rc5_","rc5_","rc6_","rc2_","rc1_","rc2_","rc3_","rc2_","rc3_","rc5_","rc7_","rc7_","rc3_","rc7_","rc6_","rc0_","rc2_","rc7_","rc4_","rc2_","rc7_","rc5_","rc1_","rc5_","rc3_","rc7_","rc5_","rc0_","rc7_","rc3_","rc4_","rc6_","rc4_","rc3_","rc3_","rc0_","rc3_","rc7_","rc4_","rc5_","rc6_","rc0_","rc6_","rc7_","rc6_","rc1_","rc1_","rc0_","rc7_","rc3_","rc0_","rc5_","rc1_","rc1_","rc7_","rc2_","rc1_","rc1_","rc7_","rc6_","rc7_","rc4_","rc0_","rc1_","rc0_","rc7_","rc7_","rc3_","rc7_","rc3_","rc1_","rc6_","rc0_","rc2_","rc6_","rc6_","rc6_","rc4_","rc0_","rc0_","rc6_","rc1_","rc6_","rc1_","rc2_","rc7_","rc5_","rc0_","rc2_","rc6_","rc6_","rc7_","rc0_","rc2_","rc6_","rc6_","rc3_","rc1_","rc2_","rc1_","rc7_","rc6_","rc1_","rc4_","rc3_","rc5_"],
|
||||||
|
["rc6_","rc3_","rc3_","rc0_","rc6_","rc6_","rc7_","rc1_","rc7_","rc5_","rc3_","rc1_","rc2_","rc0_","rc0_","rc0_","rc2_","rc3_","rc3_","rc6_","rc5_","rc0_","rc4_","rc1_","rc3_","rc5_","rc2_","rc0_","rc4_","rc7_","rc6_","rc0_","rc7_","rc7_","rc5_","rc4_","rc1_","rc4_","rc1_","rc3_","rc2_","rc1_","rc2_","rc5_","rc6_","rc1_","rc1_","rc5_","rc2_","rc0_","rc6_","rc5_","rc6_","rc4_","rc3_","rc7_","rc2_","rc4_","rc0_","rc0_","rc4_","rc0_","rc0_","rc2_","rc1_","rc1_","rc4_","rc2_","rc1_","rc1_","rc6_","rc6_","rc0_","rc6_","rc1_","rc3_","rc2_","rc3_","rc7_","rc7_","rc7_","rc0_","rc3_","rc2_","rc0_","rc4_","rc0_","rc2_","rc1_","rc0_","rc1_","rc7_","rc7_","rc5_","rc3_","rc4_","rc3_","rc1_","rc0_","rc0_","rc7_","rc6_","rc5_","rc4_","rc1_","rc3_","rc7_","rc5_","rc6_","rc7_","rc1_","rc4_","rc1_","rc3_","rc1_","rc4_","rc4_","rc7_","rc3_","rc3_","rc5_","rc0_","rc6_","rc5_","rc5_","rc1_","rc6_","rc6_","rc6_","rc7_","rc1_","rc7_","rc3_","rc1_","rc7_","rc3_","rc4_","rc0_","rc3_","rc1_","rc1_","rc4_","rc7_","rc4_"],
|
||||||
|
["rc7_","rc7_","rc7_","rc2_","rc1_","rc6_","rc4_","rc2_","rc1_","rc4_","rc5_","rc2_","rc7_","rc1_","rc1_","rc0_","rc1_","rc4_","rc0_","rc7_","rc4_","rc5_","rc2_","rc4_","rc1_","rc6_","rc7_","rc1_","rc4_","rc2_","rc1_","rc1_","rc1_","rc6_","rc7_","rc5_","rc0_","rc7_","rc4_","rc7_","rc3_","rc5_","rc7_","rc6_","rc5_","rc7_","rc4_","rc1_","rc5_","rc7_","rc3_","rc7_","rc2_","rc7_","rc7_","rc6_","rc2_","rc4_","rc2_","rc3_","rc6_","rc1_","rc7_","rc2_","rc0_","rc7_","rc0_","rc5_","rc0_","rc4_","rc1_","rc2_","rc3_","rc2_","rc4_","rc0_","rc6_","rc2_","rc7_","rc3_","rc1_","rc0_","rc3_","rc1_","rc7_","rc1_","rc6_","rc3_","rc4_","rc2_","rc4_","rc0_","rc0_","rc2_","rc1_","rc6_","rc4_","rc3_","rc2_","rc2_","rc2_","rc5_","rc4_","rc2_","rc2_","rc4_","rc5_","rc2_","rc2_","rc3_","rc2_","rc4_","rc6_","rc0_","rc1_","rc3_","rc1_","rc2_","rc0_","rc1_","rc2_","rc0_","rc5_","rc7_","rc2_","rc4_","rc7_","rc6_","rc4_","rc1_","rc5_","rc4_","rc6_","rc1_","rc6_","rc1_","rc0_","rc1_","rc0_","rc2_","rc3_","rc0_","rc5_","rc5_"],
|
||||||
|
["rc4_","rc6_","rc3_","rc6_","rc0_","rc2_","rc3_","rc2_","rc2_","rc7_","rc5_","rc2_","rc3_","rc0_","rc1_","rc2_","rc1_","rc1_","rc1_","rc2_","rc3_","rc0_","rc5_","rc5_","rc4_","rc3_","rc7_","rc1_","rc6_","rc3_","rc0_","rc6_","rc2_","rc2_","rc3_","rc2_","rc5_","rc2_","rc1_","rc4_","rc4_","rc6_","rc4_","rc7_","rc3_","rc5_","rc0_","rc2_","rc2_","rc3_","rc6_","rc6_","rc2_","rc2_","rc3_","rc7_","rc7_","rc2_","rc0_","rc6_","rc6_","rc4_","rc4_","rc6_","rc0_","rc5_","rc7_","rc6_","rc7_","rc1_","rc0_","rc7_","rc1_","rc6_","rc2_","rc7_","rc3_","rc3_","rc2_","rc5_","rc0_","rc0_","rc4_","rc6_","rc2_","rc7_","rc6_","rc6_","rc0_","rc4_","rc5_","rc3_","rc1_","rc2_","rc7_","rc7_","rc7_","rc6_","rc1_","rc4_","rc7_","rc7_","rc2_","rc5_","rc1_","rc6_","rc7_","rc2_","rc3_","rc2_","rc0_","rc4_","rc3_","rc7_","rc3_","rc2_","rc4_","rc0_","rc0_","rc4_","rc0_","rc3_","rc5_","rc6_","rc7_","rc5_","rc2_","rc7_","rc7_","rc5_","rc0_","rc2_","rc5_","rc5_","rc5_","rc4_","rc3_","rc6_","rc3_","rc0_","rc2_","rc3_","rc3_","rc0_"],
|
||||||
|
["rc2_","rc1_","rc3_","rc4_","rc0_","rc5_","rc0_","rc7_","rc6_","rc6_","rc0_","rc0_","rc1_","rc5_","rc6_","rc7_","rc7_","rc3_","rc3_","rc1_","rc0_","rc2_","rc3_","rc6_","rc0_","rc6_","rc7_","rc0_","rc1_","rc5_","rc1_","rc7_","rc5_","rc4_","rc5_","rc3_","rc4_","rc4_","rc5_","rc1_","rc3_","rc6_","rc5_","rc1_","rc7_","rc3_","rc1_","rc7_","rc0_","rc7_","rc4_","rc1_","rc1_","rc6_","rc3_","rc1_","rc7_","rc7_","rc1_","rc4_","rc0_","rc0_","rc4_","rc1_","rc5_","rc2_","rc7_","rc6_","rc3_","rc7_","rc1_","rc0_","rc7_","rc2_","rc6_","rc1_","rc0_","rc6_","rc5_","rc7_","rc2_","rc1_","rc2_","rc2_","rc7_","rc1_","rc5_","rc6_","rc1_","rc0_","rc2_","rc2_","rc6_","rc5_","rc2_","rc0_","rc2_","rc3_","rc3_","rc6_","rc3_","rc5_","rc3_","rc4_","rc1_","rc2_","rc2_","rc0_","rc5_","rc6_","rc1_","rc6_","rc4_","rc1_","rc5_","rc4_","rc3_","rc4_","rc1_","rc4_","rc5_","rc1_","rc3_","rc3_","rc3_","rc2_","rc5_","rc2_","rc3_","rc6_","rc7_","rc3_","rc5_","rc7_","rc3_","rc7_","rc2_","rc6_","rc1_","rc5_","rc5_","rc3_","rc4_","rc5_"],
|
||||||
|
["rc6_","rc0_","rc5_","rc6_","rc5_","rc6_","rc7_","rc5_","rc4_","rc3_","rc3_","rc7_","rc0_","rc2_","rc4_","rc1_","rc1_","rc2_","rc5_","rc5_","rc0_","rc4_","rc1_","rc7_","rc1_","rc7_","rc3_","rc1_","rc1_","rc6_","rc0_","rc5_","rc1_","rc5_","rc2_","rc1_","rc4_","rc0_","rc7_","rc7_","rc5_","rc5_","rc1_","rc5_","rc5_","rc2_","rc7_","rc3_","rc4_","rc2_","rc3_","rc3_","rc5_","rc4_","rc5_","rc6_","rc7_","rc4_","rc1_","rc4_","rc0_","rc7_","rc4_","rc4_","rc5_","rc1_","rc5_","rc5_","rc0_","rc1_","rc1_","rc3_","rc2_","rc7_","rc7_","rc7_","rc1_","rc4_","rc6_","rc0_","rc3_","rc3_","rc3_","rc7_","rc3_","rc7_","rc7_","rc2_","rc3_","rc6_","rc1_","rc6_","rc3_","rc4_","rc0_","rc2_","rc1_","rc3_","rc4_","rc2_","rc2_","rc1_","rc5_","rc1_","rc0_","rc2_","rc4_","rc3_","rc5_","rc7_","rc1_","rc2_","rc6_","rc7_","rc4_","rc7_","rc3_","rc6_","rc0_","rc4_","rc6_","rc4_","rc4_","rc7_","rc2_","rc7_","rc4_","rc1_","rc6_","rc3_","rc0_","rc7_","rc2_","rc0_","rc3_","rc1_","rc1_","rc5_","rc7_","rc2_","rc0_","rc4_","rc0_","rc0_"],
|
||||||
|
["rc6_","rc5_","rc6_","rc4_","rc5_","rc0_","rc6_","rc3_","rc7_","rc6_","rc2_","rc6_","rc4_","rc7_","rc0_","rc7_","rc4_","rc1_","rc1_","rc6_","rc7_","rc7_","rc4_","rc3_","rc5_","rc0_","rc2_","rc4_","rc3_","rc2_","rc3_","rc1_","rc3_","rc6_","rc1_","rc6_","rc0_","rc6_","rc2_","rc1_","rc0_","rc4_","rc4_","rc4_","rc2_","rc5_","rc4_","rc5_","rc1_","rc6_","rc0_","rc5_","rc2_","rc5_","rc6_","rc6_","rc3_","rc3_","rc4_","rc1_","rc5_","rc1_","rc2_","rc6_","rc4_","rc1_","rc4_","rc4_","rc4_","rc6_","rc5_","rc4_","rc6_","rc7_","rc0_","rc2_","rc3_","rc7_","rc0_","rc3_","rc0_","rc1_","rc3_","rc5_","rc3_","rc2_","rc3_","rc3_","rc4_","rc7_","rc5_","rc0_","rc7_","rc1_","rc5_","rc7_","rc2_","rc6_","rc2_","rc0_","rc2_","rc2_","rc5_","rc5_","rc3_","rc6_","rc0_","rc5_","rc0_","rc7_","rc5_","rc1_","rc7_","rc2_","rc4_","rc6_","rc0_","rc7_","rc1_","rc2_","rc0_","rc3_","rc5_","rc2_","rc1_","rc3_","rc4_","rc4_","rc4_","rc6_","rc0_","rc0_","rc2_","rc2_","rc4_","rc4_","rc7_","rc1_","rc2_","rc0_","rc0_","rc5_","rc1_","rc7_"],
|
||||||
|
["rc7_","rc2_","rc2_","rc0_","rc4_","rc3_","rc2_","rc3_","rc6_","rc0_","rc4_","rc0_","rc2_","rc6_","rc0_","rc4_","rc3_","rc7_","rc7_","rc5_","rc3_","rc4_","rc0_","rc1_","rc1_","rc1_","rc0_","rc2_","rc4_","rc0_","rc5_","rc4_","rc7_","rc0_","rc4_","rc2_","rc5_","rc6_","rc4_","rc6_","rc6_","rc4_","rc3_","rc0_","rc3_","rc2_","rc7_","rc0_","rc7_","rc3_","rc7_","rc7_","rc6_","rc2_","rc3_","rc3_","rc2_","rc4_","rc1_","rc2_","rc4_","rc0_","rc2_","rc2_","rc0_","rc4_","rc4_","rc5_","rc4_","rc1_","rc1_","rc2_","rc2_","rc2_","rc0_","rc2_","rc3_","rc0_","rc2_","rc1_","rc7_","rc2_","rc0_","rc6_","rc3_","rc3_","rc4_","rc4_","rc2_","rc5_","rc5_","rc1_","rc7_","rc5_","rc6_","rc7_","rc1_","rc6_","rc1_","rc1_","rc0_","rc3_","rc0_","rc1_","rc7_","rc7_","rc4_","rc0_","rc3_","rc7_","rc2_","rc5_","rc3_","rc3_","rc3_","rc1_","rc1_","rc0_","rc2_","rc2_","rc0_","rc1_","rc3_","rc7_","rc5_","rc0_","rc3_","rc3_","rc3_","rc7_","rc3_","rc6_","rc2_","rc4_","rc0_","rc1_","rc0_","rc5_","rc0_","rc0_","rc2_","rc7_","rc5_","rc4_"],
|
||||||
|
["rc4_","rc6_","rc6_","rc2_","rc0_","rc0_","rc7_","rc6_","rc4_","rc2_","rc5_","rc4_","rc7_","rc0_","rc7_","rc0_","rc5_","rc6_","rc2_","rc4_","rc1_","rc5_","rc3_","rc2_","rc2_","rc3_","rc2_","rc3_","rc1_","rc1_","rc5_","rc0_","rc2_","rc3_","rc2_","rc7_","rc1_","rc3_","rc2_","rc0_","rc7_","rc7_","rc2_","rc7_","rc5_","rc5_","rc4_","rc5_","rc0_","rc4_","rc6_","rc3_","rc6_","rc4_","rc0_","rc6_","rc0_","rc1_","rc3_","rc1_","rc0_","rc4_","rc1_","rc7_","rc4_","rc3_","rc0_","rc1_","rc4_","rc2_","rc3_","rc7_","rc1_","rc1_","rc2_","rc2_","rc6_","rc7_","rc1_","rc1_","rc4_","rc0_","rc7_","rc2_","rc0_","rc4_","rc7_","rc4_","rc0_","rc0_","rc4_","rc2_","rc6_","rc0_","rc1_","rc3_","rc3_","rc5_","rc6_","rc7_","rc0_","rc3_","rc2_","rc5_","rc1_","rc7_","rc5_","rc3_","rc3_","rc7_","rc5_","rc5_","rc0_","rc2_","rc5_","rc2_","rc0_","rc2_","rc0_","rc3_","rc2_","rc7_","rc4_","rc6_","rc4_","rc6_","rc4_","rc2_","rc7_","rc1_","rc6_","rc3_","rc6_","rc1_","rc7_","rc0_","rc0_","rc1_","rc4_","rc3_","rc4_","rc5_","rc2_","rc1_"],
|
||||||
|
["rc5_","rc2_","rc0_","rc3_","rc6_","rc0_","rc3_","rc4_","rc7_","rc6_","rc2_","rc4_","rc1_","rc5_","rc4_","rc4_","rc7_","rc7_","rc7_","rc3_","rc5_","rc1_","rc2_","rc1_","rc5_","rc7_","rc5_","rc2_","rc0_","rc7_","rc7_","rc5_","rc2_","rc1_","rc0_","rc5_","rc1_","rc5_","rc1_","rc7_","rc7_","rc5_","rc0_","rc5_","rc6_","rc5_","rc0_","rc3_","rc3_","rc0_","rc1_","rc1_","rc6_","rc5_","rc3_","rc0_","rc1_","rc2_","rc1_","rc0_","rc7_","rc7_","rc4_","rc0_","rc0_","rc6_","rc5_","rc0_","rc2_","rc1_","rc0_","rc4_","rc1_","rc5_","rc5_","rc1_","rc2_","rc6_","rc0_","rc6_","rc4_","rc4_","rc3_","rc3_","rc1_","rc4_","rc3_","rc4_","rc4_","rc1_","rc0_","rc4_","rc2_","rc4_","rc1_","rc4_","rc6_","rc2_","rc0_","rc3_","rc0_","rc5_","rc1_","rc2_","rc6_","rc6_","rc1_","rc0_","rc6_","rc1_","rc4_","rc4_","rc2_","rc1_","rc7_","rc1_","rc5_","rc6_","rc0_","rc7_","rc5_","rc4_","rc3_","rc7_","rc1_","rc6_","rc6_","rc7_","rc5_","rc3_","rc7_","rc7_","rc4_","rc0_","rc5_","rc3_","rc5_","rc6_","rc4_","rc2_","rc1_","rc5_","rc4_","rc6_"],
|
||||||
|
["rc4_","rc1_","rc4_","rc5_","rc2_","rc4_","rc3_","rc7_","rc4_","rc4_","rc0_","rc1_","rc3_","rc6_","rc3_","rc2_","rc4_","rc3_","rc4_","rc4_","rc5_","rc2_","rc2_","rc5_","rc7_","rc7_","rc6_","rc7_","rc4_","rc3_","rc1_","rc4_","rc3_","rc3_","rc2_","rc6_","rc1_","rc5_","rc5_","rc5_","rc3_","rc0_","rc1_","rc2_","rc1_","rc3_","rc1_","rc5_","rc5_","rc2_","rc5_","rc2_","rc4_","rc4_","rc1_","rc1_","rc4_","rc0_","rc7_","rc6_","rc7_","rc1_","rc1_","rc6_","rc6_","rc0_","rc1_","rc3_","rc2_","rc1_","rc4_","rc1_","rc7_","rc0_","rc4_","rc2_","rc3_","rc6_","rc6_","rc7_","rc5_","rc6_","rc4_","rc1_","rc1_","rc5_","rc3_","rc7_","rc3_","rc2_","rc7_","rc0_","rc1_","rc1_","rc5_","rc3_","rc6_","rc6_","rc2_","rc5_","rc4_","rc1_","rc2_","rc3_","rc3_","rc5_","rc3_","rc1_","rc7_","rc5_","rc3_","rc2_","rc6_","rc1_","rc7_","rc0_","rc3_","rc5_","rc7_","rc7_","rc4_","rc3_","rc6_","rc5_","rc3_","rc3_","rc6_","rc4_","rc3_","rc7_","rc3_","rc4_","rc0_","rc4_","rc6_","rc3_","rc4_","rc6_","rc5_","rc6_","rc0_","rc3_","rc1_","rc4_"],
|
||||||
|
["rc0_","rc2_","rc0_","rc0_","rc2_","rc5_","rc4_","rc0_","rc0_","rc5_","rc4_","rc5_","rc4_","rc6_","rc2_","rc2_","rc4_","rc3_","rc5_","rc7_","rc6_","rc2_","rc7_","rc0_","rc5_","rc3_","rc2_","rc2_","rc4_","rc5_","rc6_","rc6_","rc2_","rc2_","rc6_","rc2_","rc7_","rc4_","rc4_","rc3_","rc7_","rc0_","rc2_","rc7_","rc5_","rc2_","rc3_","rc3_","rc1_","rc1_","rc0_","rc0_","rc5_","rc4_","rc7_","rc3_","rc4_","rc5_","rc2_","rc5_","rc4_","rc5_","rc4_","rc0_","rc5_","rc0_","rc1_","rc4_","rc2_","rc2_","rc6_","rc0_","rc0_","rc2_","rc6_","rc5_","rc5_","rc7_","rc7_","rc7_","rc3_","rc1_","rc5_","rc5_","rc5_","rc1_","rc5_","rc4_","rc1_","rc2_","rc4_","rc7_","rc7_","rc1_","rc1_","rc2_","rc1_","rc4_","rc1_","rc6_","rc3_","rc0_","rc2_","rc7_","rc4_","rc5_","rc2_","rc5_","rc5_","rc5_","rc0_","rc0_","rc2_","rc3_","rc2_","rc7_","rc7_","rc1_","rc1_","rc3_","rc5_","rc5_","rc2_","rc7_","rc6_","rc4_","rc7_","rc3_","rc5_","rc7_","rc6_","rc2_","rc0_","rc5_","rc0_","rc0_","rc2_","rc1_","rc4_","rc0_","rc5_","rc5_","rc4_","rc4_"],
|
||||||
|
["rc5_","rc0_","rc1_","rc6_","rc3_","rc4_","rc3_","rc7_","rc0_","rc3_","rc3_","rc7_","rc0_","rc3_","rc5_","rc4_","rc1_","rc7_","rc0_","rc6_","rc4_","rc1_","rc0_","rc2_","rc3_","rc4_","rc6_","rc6_","rc4_","rc7_","rc5_","rc5_","rc5_","rc7_","rc0_","rc2_","rc0_","rc3_","rc3_","rc2_","rc1_","rc6_","rc0_","rc5_","rc6_","rc0_","rc3_","rc6_","rc6_","rc6_","rc7_","rc3_","rc5_","rc4_","rc2_","rc7_","rc7_","rc0_","rc6_","rc6_","rc2_","rc1_","rc2_","rc1_","rc2_","rc0_","rc1_","rc3_","rc7_","rc5_","rc1_","rc2_","rc1_","rc5_","rc7_","rc2_","rc7_","rc2_","rc0_","rc7_","rc4_","rc4_","rc3_","rc1_","rc3_","rc7_","rc6_","rc5_","rc5_","rc5_","rc6_","rc2_","rc1_","rc5_","rc3_","rc0_","rc3_","rc4_","rc3_","rc0_","rc7_","rc3_","rc5_","rc0_","rc0_","rc0_","rc1_","rc6_","rc4_","rc2_","rc6_","rc7_","rc2_","rc0_","rc4_","rc0_","rc0_","rc1_","rc4_","rc5_","rc6_","rc1_","rc5_","rc0_","rc6_","rc2_","rc0_","rc4_","rc0_","rc1_","rc5_","rc2_","rc1_","rc3_","rc7_","rc4_","rc4_","rc0_","rc6_","rc0_","rc5_","rc7_","rc4_","rc0_"],
|
||||||
|
["rc1_","rc2_","rc3_","rc0_","rc1_","rc3_","rc4_","rc7_","rc1_","rc6_","rc2_","rc1_","rc4_","rc1_","rc1_","rc4_","rc2_","rc2_","rc1_","rc1_","rc5_","rc0_","rc0_","rc6_","rc0_","rc4_","rc7_","rc2_","rc1_","rc1_","rc2_","rc0_","rc1_","rc2_","rc6_","rc0_","rc1_","rc3_","rc7_","rc2_","rc7_","rc3_","rc7_","rc5_","rc1_","rc1_","rc6_","rc7_","rc1_","rc4_","rc6_","rc5_","rc2_","rc7_","rc6_","rc5_","rc2_","rc5_","rc2_","rc2_","rc0_","rc0_","rc0_","rc0_","rc0_","rc1_","rc6_","rc1_","rc5_","rc3_","rc3_","rc0_","rc7_","rc1_","rc3_","rc3_","rc5_","rc2_","rc7_","rc6_","rc4_","rc1_","rc4_","rc6_","rc0_","rc2_","rc2_","rc3_","rc3_","rc1_","rc0_","rc1_","rc4_","rc5_","rc7_","rc0_","rc1_","rc6_","rc4_","rc3_","rc0_","rc3_","rc1_","rc7_","rc2_","rc7_","rc6_","rc5_","rc1_","rc4_","rc4_","rc1_","rc4_","rc0_","rc3_","rc3_","rc1_","rc0_","rc5_","rc6_","rc2_","rc2_","rc2_","rc7_","rc3_","rc7_","rc5_","rc0_","rc2_","rc1_","rc6_","rc6_","rc0_","rc1_","rc2_","rc0_","rc7_","rc5_","rc0_","rc1_","rc5_","rc0_","rc6_","rc0_"],
|
||||||
|
["rc0_","rc2_","rc3_","rc5_","rc2_","rc1_","rc5_","rc7_","rc7_","rc0_","rc7_","rc4_","rc5_","rc7_","rc3_","rc0_","rc4_","rc3_","rc6_","rc2_","rc5_","rc7_","rc4_","rc3_","rc7_","rc3_","rc1_","rc0_","rc0_","rc5_","rc3_","rc2_","rc1_","rc5_","rc4_","rc4_","rc6_","rc6_","rc4_","rc5_","rc4_","rc1_","rc6_","rc7_","rc3_","rc3_","rc2_","rc7_","rc6_","rc3_","rc3_","rc6_","rc0_","rc5_","rc1_","rc7_","rc2_","rc2_","rc2_","rc2_","rc3_","rc3_","rc4_","rc0_","rc7_","rc4_","rc7_","rc0_","rc2_","rc6_","rc1_","rc2_","rc7_","rc7_","rc1_","rc2_","rc4_","rc5_","rc0_","rc7_","rc1_","rc1_","rc5_","rc4_","rc1_","rc1_","rc0_","rc6_","rc7_","rc1_","rc1_","rc7_","rc5_","rc3_","rc2_","rc3_","rc1_","rc4_","rc2_","rc1_","rc1_","rc1_","rc3_","rc4_","rc0_","rc1_","rc7_","rc3_","rc1_","rc5_","rc6_","rc6_","rc4_","rc6_","rc3_","rc2_","rc7_","rc5_","rc0_","rc6_","rc7_","rc1_","rc7_","rc7_","rc7_","rc4_","rc3_","rc1_","rc7_","rc7_","rc6_","rc7_","rc1_","rc7_","rc4_","rc4_","rc0_","rc0_","rc0_","rc3_","rc2_","rc1_","rc5_","rc4_"],
|
||||||
|
["rc0_","rc0_","rc7_","rc1_","rc3_","rc0_","rc3_","rc0_","rc1_","rc0_","rc5_","rc1_","rc0_","rc6_","rc1_","rc2_","rc2_","rc4_","rc4_","rc1_","rc2_","rc1_","rc3_","rc2_","rc7_","rc3_","rc3_","rc2_","rc6_","rc3_","rc4_","rc3_","rc4_","rc2_","rc0_","rc0_","rc4_","rc3_","rc0_","rc4_","rc6_","rc0_","rc1_","rc6_","rc1_","rc2_","rc2_","rc0_","rc2_","rc3_","rc2_","rc0_","rc5_","rc6_","rc0_","rc6_","rc4_","rc2_","rc2_","rc7_","rc6_","rc3_","rc2_","rc2_","rc1_","rc1_","rc6_","rc1_","rc3_","rc5_","rc7_","rc2_","rc5_","rc1_","rc5_","rc6_","rc2_","rc7_","rc0_","rc1_","rc6_","rc5_","rc1_","rc4_","rc2_","rc7_","rc3_","rc0_","rc7_","rc5_","rc4_","rc4_","rc1_","rc7_","rc1_","rc0_","rc7_","rc7_","rc1_","rc2_","rc7_","rc6_","rc0_","rc1_","rc7_","rc1_","rc7_","rc1_","rc2_","rc5_","rc2_","rc7_","rc7_","rc1_","rc2_","rc5_","rc0_","rc3_","rc4_","rc7_","rc2_","rc5_","rc2_","rc7_","rc0_","rc1_","rc0_","rc6_","rc5_","rc3_","rc1_","rc4_","rc2_","rc6_","rc3_","rc3_","rc4_","rc2_","rc1_","rc7_","rc1_","rc5_","rc0_","rc0_"],
|
||||||
|
["rc5_","rc7_","rc4_","rc2_","rc0_","rc2_","rc3_","rc4_","rc2_","rc1_","rc2_","rc1_","rc2_","rc0_","rc7_","rc4_","rc4_","rc5_","rc6_","rc7_","rc1_","rc6_","rc0_","rc6_","rc3_","rc4_","rc1_","rc7_","rc1_","rc6_","rc2_","rc4_","rc7_","rc0_","rc6_","rc5_","rc1_","rc4_","rc0_","rc7_","rc2_","rc2_","rc5_","rc2_","rc0_","rc5_","rc6_","rc2_","rc3_","rc6_","rc1_","rc3_","rc6_","rc5_","rc7_","rc3_","rc4_","rc5_","rc1_","rc2_","rc7_","rc0_","rc7_","rc5_","rc5_","rc2_","rc2_","rc4_","rc4_","rc2_","rc3_","rc0_","rc0_","rc7_","rc3_","rc1_","rc2_","rc7_","rc4_","rc7_","rc3_","rc5_","rc0_","rc0_","rc1_","rc4_","rc1_","rc1_","rc1_","rc7_","rc0_","rc0_","rc6_","rc3_","rc2_","rc2_","rc0_","rc0_","rc7_","rc0_","rc1_","rc3_","rc5_","rc7_","rc4_","rc0_","rc5_","rc0_","rc7_","rc6_","rc4_","rc5_","rc3_","rc3_","rc4_","rc5_","rc1_","rc1_","rc4_","rc2_","rc7_","rc1_","rc6_","rc1_","rc4_","rc0_","rc0_","rc2_","rc0_","rc7_","rc5_","rc1_","rc7_","rc0_","rc4_","rc3_","rc7_","rc5_","rc1_","rc5_","rc0_","rc2_","rc3_","rc2_"],
|
||||||
|
["rc4_","rc6_","rc6_","rc3_","rc7_","rc7_","rc1_","rc4_","rc1_","rc4_","rc3_","rc5_","rc1_","rc6_","rc2_","rc6_","rc4_","rc1_","rc4_","rc6_","rc6_","rc7_","rc1_","rc6_","rc1_","rc7_","rc0_","rc1_","rc4_","rc4_","rc2_","rc7_","rc5_","rc0_","rc4_","rc2_","rc2_","rc3_","rc1_","rc1_","rc5_","rc7_","rc7_","rc3_","rc6_","rc6_","rc0_","rc6_","rc5_","rc5_","rc4_","rc1_","rc0_","rc2_","rc5_","rc6_","rc1_","rc5_","rc3_","rc4_","rc4_","rc3_","rc1_","rc4_","rc7_","rc1_","rc0_","rc2_","rc3_","rc7_","rc2_","rc7_","rc3_","rc2_","rc2_","rc5_","rc3_","rc6_","rc2_","rc2_","rc2_","rc4_","rc5_","rc0_","rc2_","rc1_","rc6_","rc4_","rc0_","rc7_","rc1_","rc6_","rc7_","rc0_","rc0_","rc0_","rc2_","rc7_","rc0_","rc3_","rc2_","rc2_","rc6_","rc6_","rc4_","rc5_","rc4_","rc1_","rc7_","rc0_","rc0_","rc1_","rc4_","rc5_","rc7_","rc4_","rc7_","rc2_","rc6_","rc0_","rc5_","rc6_","rc1_","rc6_","rc6_","rc1_","rc0_","rc5_","rc5_","rc4_","rc6_","rc4_","rc6_","rc4_","rc3_","rc0_","rc0_","rc1_","rc5_","rc0_","rc2_","rc4_","rc3_","rc4_"],
|
||||||
|
["rc3_","rc0_","rc2_","rc5_","rc4_","rc7_","rc4_","rc1_","rc1_","rc0_","rc5_","rc6_","rc1_","rc0_","rc7_","rc1_","rc1_","rc0_","rc1_","rc7_","rc0_","rc5_","rc3_","rc4_","rc6_","rc5_","rc5_","rc1_","rc6_","rc0_","rc1_","rc4_","rc6_","rc5_","rc7_","rc3_","rc4_","rc7_","rc7_","rc0_","rc3_","rc0_","rc4_","rc4_","rc7_","rc5_","rc7_","rc5_","rc5_","rc1_","rc1_","rc2_","rc7_","rc6_","rc5_","rc1_","rc6_","rc1_","rc5_","rc6_","rc1_","rc6_","rc4_","rc7_","rc5_","rc5_","rc4_","rc5_","rc5_","rc3_","rc1_","rc6_","rc4_","rc3_","rc6_","rc1_","rc0_","rc6_","rc6_","rc1_","rc2_","rc1_","rc5_","rc6_","rc3_","rc7_","rc1_","rc0_","rc2_","rc6_","rc3_","rc5_","rc3_","rc6_","rc2_","rc5_","rc1_","rc7_","rc2_","rc5_","rc7_","rc2_","rc1_","rc1_","rc4_","rc3_","rc2_","rc5_","rc5_","rc5_","rc6_","rc5_","rc0_","rc7_","rc7_","rc3_","rc6_","rc6_","rc7_","rc1_","rc0_","rc3_","rc1_","rc7_","rc5_","rc6_","rc5_","rc0_","rc2_","rc3_","rc2_","rc1_","rc4_","rc4_","rc7_","rc1_","rc2_","rc7_","rc2_","rc7_","rc6_","rc2_","rc5_","rc0_"],
|
||||||
|
["rc6_","rc4_","rc6_","rc0_","rc6_","rc5_","rc7_","rc3_","rc0_","rc0_","rc5_","rc4_","rc6_","rc0_","rc4_","rc6_","rc7_","rc2_","rc2_","rc2_","rc1_","rc2_","rc3_","rc0_","rc7_","rc0_","rc6_","rc1_","rc3_","rc3_","rc5_","rc3_","rc4_","rc6_","rc2_","rc6_","rc3_","rc3_","rc0_","rc0_","rc3_","rc6_","rc1_","rc4_","rc0_","rc4_","rc7_","rc1_","rc1_","rc3_","rc4_","rc7_","rc0_","rc2_","rc5_","rc4_","rc2_","rc5_","rc4_","rc1_","rc2_","rc2_","rc5_","rc7_","rc3_","rc0_","rc4_","rc6_","rc6_","rc1_","rc5_","rc6_","rc0_","rc4_","rc3_","rc7_","rc0_","rc0_","rc5_","rc7_","rc0_","rc6_","rc6_","rc2_","rc1_","rc7_","rc5_","rc7_","rc4_","rc6_","rc5_","rc0_","rc6_","rc6_","rc5_","rc2_","rc3_","rc7_","rc2_","rc6_","rc7_","rc5_","rc3_","rc6_","rc0_","rc2_","rc5_","rc4_","rc0_","rc6_","rc0_","rc0_","rc3_","rc4_","rc2_","rc1_","rc4_","rc6_","rc3_","rc7_","rc4_","rc3_","rc1_","rc6_","rc5_","rc0_","rc5_","rc4_","rc3_","rc5_","rc5_","rc6_","rc5_","rc2_","rc3_","rc0_","rc3_","rc1_","rc6_","rc5_","rc0_","rc5_","rc7_","rc6_"],
|
||||||
|
["rc2_","rc4_","rc7_","rc6_","rc7_","rc1_","rc7_","rc5_","rc3_","rc5_","rc0_","rc2_","rc7_","rc7_","rc5_","rc7_","rc4_","rc1_","rc5_","rc0_","rc1_","rc5_","rc5_","rc4_","rc0_","rc0_","rc6_","rc0_","rc7_","rc6_","rc2_","rc0_","rc6_","rc6_","rc5_","rc7_","rc5_","rc7_","rc1_","rc0_","rc0_","rc3_","rc3_","rc6_","rc5_","rc3_","rc5_","rc1_","rc5_","rc3_","rc3_","rc2_","rc2_","rc0_","rc1_","rc2_","rc0_","rc7_","rc4_","rc6_","rc6_","rc7_","rc1_","rc5_","rc7_","rc2_","rc4_","rc4_","rc4_","rc0_","rc2_","rc2_","rc4_","rc5_","rc0_","rc0_","rc7_","rc4_","rc5_","rc3_","rc7_","rc4_","rc5_","rc6_","rc1_","rc2_","rc0_","rc1_","rc2_","rc7_","rc2_","rc6_","rc5_","rc3_","rc4_","rc6_","rc4_","rc1_","rc4_","rc7_","rc5_","rc5_","rc0_","rc1_","rc7_","rc4_","rc0_","rc1_","rc4_","rc3_","rc5_","rc5_","rc2_","rc3_","rc5_","rc2_","rc5_","rc3_","rc0_","rc2_","rc7_","rc6_","rc7_","rc2_","rc3_","rc7_","rc4_","rc3_","rc6_","rc2_","rc5_","rc6_","rc7_","rc5_","rc5_","rc6_","rc0_","rc7_","rc4_","rc1_","rc5_","rc7_","rc5_","rc7_"],
|
||||||
|
["rc5_","rc0_","rc1_","rc6_","rc7_","rc4_","rc3_","rc5_","rc7_","rc7_","rc3_","rc0_","rc0_","rc5_","rc7_","rc4_","rc4_","rc6_","rc7_","rc3_","rc2_","rc0_","rc7_","rc1_","rc0_","rc6_","rc3_","rc0_","rc2_","rc1_","rc5_","rc1_","rc1_","rc4_","rc3_","rc4_","rc6_","rc4_","rc7_","rc2_","rc1_","rc7_","rc7_","rc1_","rc6_","rc4_","rc6_","rc0_","rc7_","rc4_","rc2_","rc4_","rc0_","rc7_","rc0_","rc2_","rc6_","rc2_","rc4_","rc5_","rc2_","rc7_","rc6_","rc2_","rc5_","rc6_","rc1_","rc3_","rc3_","rc3_","rc6_","rc1_","rc5_","rc0_","rc1_","rc5_","rc2_","rc4_","rc2_","rc0_","rc7_","rc4_","rc6_","rc2_","rc7_","rc1_","rc6_","rc0_","rc3_","rc2_","rc1_","rc2_","rc5_","rc3_","rc6_","rc4_","rc2_","rc6_","rc5_","rc2_","rc6_","rc2_","rc7_","rc1_","rc4_","rc1_","rc2_","rc4_","rc7_","rc6_","rc1_","rc5_","rc3_","rc6_","rc3_","rc4_","rc7_","rc6_","rc3_","rc5_","rc7_","rc6_","rc1_","rc5_","rc4_","rc5_","rc7_","rc5_","rc7_","rc5_","rc6_","rc2_","rc6_","rc0_","rc1_","rc4_","rc6_","rc2_","rc2_","rc5_","rc2_","rc1_","rc5_","rc5_"],
|
||||||
|
["rc3_","rc3_","rc2_","rc4_","rc1_","rc7_","rc6_","rc7_","rc0_","rc7_","rc4_","rc7_","rc7_","rc3_","rc7_","rc6_","rc5_","rc2_","rc4_","rc3_","rc4_","rc5_","rc6_","rc0_","rc2_","rc4_","rc2_","rc2_","rc6_","rc5_","rc4_","rc0_","rc0_","rc2_","rc1_","rc0_","rc5_","rc3_","rc7_","rc7_","rc1_","rc3_","rc2_","rc7_","rc5_","rc7_","rc0_","rc6_","rc3_","rc5_","rc7_","rc5_","rc7_","rc1_","rc5_","rc6_","rc1_","rc6_","rc0_","rc1_","rc1_","rc3_","rc0_","rc0_","rc2_","rc3_","rc2_","rc1_","rc2_","rc2_","rc6_","rc5_","rc0_","rc5_","rc3_","rc7_","rc7_","rc1_","rc1_","rc7_","rc2_","rc6_","rc7_","rc7_","rc0_","rc5_","rc6_","rc5_","rc3_","rc0_","rc6_","rc3_","rc3_","rc2_","rc7_","rc3_","rc0_","rc7_","rc3_","rc7_","rc0_","rc4_","rc3_","rc0_","rc6_","rc2_","rc7_","rc5_","rc4_","rc7_","rc1_","rc7_","rc2_","rc6_","rc4_","rc3_","rc7_","rc0_","rc1_","rc7_","rc7_","rc3_","rc2_","rc0_","rc5_","rc2_","rc3_","rc3_","rc3_","rc5_","rc6_","rc2_","rc1_","rc2_","rc6_","rc2_","rc2_","rc4_","rc6_","rc3_","rc5_","rc3_","rc2_","rc7_"],
|
||||||
|
["rc2_","rc4_","rc6_","rc7_","rc3_","rc3_","rc6_","rc2_","rc5_","rc6_","rc6_","rc7_","rc7_","rc4_","rc3_","rc6_","rc3_","rc5_","rc1_","rc2_","rc2_","rc3_","rc7_","rc1_","rc5_","rc2_","rc0_","rc7_","rc1_","rc4_","rc3_","rc7_","rc3_","rc1_","rc5_","rc4_","rc4_","rc5_","rc5_","rc7_","rc6_","rc1_","rc1_","rc2_","rc0_","rc6_","rc7_","rc4_","rc7_","rc0_","rc6_","rc6_","rc6_","rc0_","rc6_","rc6_","rc6_","rc4_","rc5_","rc1_","rc1_","rc3_","rc4_","rc7_","rc4_","rc3_","rc1_","rc1_","rc3_","rc6_","rc6_","rc6_","rc2_","rc5_","rc2_","rc7_","rc1_","rc3_","rc7_","rc7_","rc7_","rc5_","rc4_","rc7_","rc3_","rc0_","rc3_","rc1_","rc6_","rc3_","rc5_","rc3_","rc5_","rc7_","rc5_","rc6_","rc6_","rc4_","rc3_","rc0_","rc0_","rc6_","rc2_","rc7_","rc0_","rc1_","rc3_","rc7_","rc1_","rc0_","rc3_","rc6_","rc4_","rc4_","rc3_","rc5_","rc1_","rc3_","rc6_","rc1_","rc5_","rc6_","rc1_","rc4_","rc4_","rc0_","rc6_","rc6_","rc0_","rc4_","rc1_","rc7_","rc2_","rc6_","rc7_","rc2_","rc1_","rc5_","rc3_","rc2_","rc1_","rc7_","rc3_","rc0_"]]
|
Loading…
Reference in New Issue
Block a user