1
0
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:
AlexVinS 2016-11-13 13:38:42 +03:00
parent 5127061e28
commit a85b4cf2a5
70 changed files with 18728 additions and 687 deletions

View File

@ -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);
} }

View File

@ -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 )

View 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" }
}
}
}
}

View File

@ -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
}
}
}
} }

View File

@ -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
}; };

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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
{ {

View File

@ -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]);
}
} }
/************************************************************************/ /************************************************************************/

View File

@ -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;

View File

@ -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);

View File

@ -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;
} }

View File

@ -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)
{ {

View File

@ -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;

View File

@ -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();
}
} }
}; };

View File

@ -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;

View File

@ -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;
}; };

View File

@ -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(){};

View File

@ -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;

View File

@ -83,11 +83,12 @@ JsonNode::JsonNode(const JsonNode &copy):
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:
{ {

View File

@ -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;
}
} }
}; };

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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"
};
}

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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));
}
} }
} }
} }

View File

@ -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();

View File

@ -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;

View File

@ -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)

View File

@ -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();

View File

@ -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

View File

@ -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();

View File

@ -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();

View File

@ -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()

View File

@ -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())
{ {

View File

@ -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;
}
} }
}; };

View File

@ -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;
}; };

View File

@ -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.

View File

@ -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");

View File

@ -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;
}; };

View File

@ -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();
}
}
}

View File

@ -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;

View File

@ -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)
{ {

View File

@ -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.
*/ */

View File

@ -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();
} }

View File

@ -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";

View File

@ -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);
}
}

View File

@ -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);
}; };

View File

@ -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);
} }

View File

@ -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());
}

View File

@ -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));
} }
} }

View File

@ -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);
}; };

View File

@ -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();
} }

View File

@ -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})

View File

@ -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");
} }

View File

@ -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)){

View File

@ -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);
}

View File

@ -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);
};

View 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
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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_"]]

View 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_"]]