From a85b4cf2a57b0e762f3f00ec95c0fef21b875383 Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Sun, 13 Nov 2016 13:38:42 +0300 Subject: [PATCH] * 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 --- AI/VCAI/Goals.cpp | 6 + client/CPreGame.cpp | 4 +- config/factions/random.json | 69 + lib/CArtHandler.cpp | 101 +- lib/CArtHandler.h | 15 +- lib/CCreatureHandler.cpp | 14 + lib/CCreatureHandler.h | 6 + lib/CCreatureSet.cpp | 111 +- lib/CCreatureSet.h | 15 +- lib/CGameInfoCallback.cpp | 12 +- lib/CGameState.cpp | 79 +- lib/CHeroHandler.cpp | 3 +- lib/CModHandler.cpp | 68 +- lib/CModHandler.h | 10 +- lib/CTownHandler.cpp | 84 +- lib/CTownHandler.h | 35 +- lib/GameConstants.h | 25 +- lib/IGameCallback.h | 3 +- lib/IHandlerBase.h | 3 + lib/JsonDetail.cpp | 102 +- lib/JsonNode.cpp | 68 +- lib/JsonNode.h | 18 +- lib/NetPacksLib.cpp | 6 +- lib/ResourceSet.cpp | 14 + lib/ResourceSet.h | 3 + lib/StringConstants.h | 26 +- lib/mapObjects/CGHeroInstance.cpp | 221 +- lib/mapObjects/CGHeroInstance.h | 14 +- lib/mapObjects/CGPandoraBox.cpp | 104 + lib/mapObjects/CGPandoraBox.h | 3 + lib/mapObjects/CGTownInstance.cpp | 221 +- lib/mapObjects/CGTownInstance.h | 34 +- lib/mapObjects/CObjectClassesHandler.h | 2 + lib/mapObjects/CObjectHandler.cpp | 34 +- lib/mapObjects/CQuest.cpp | 251 + lib/mapObjects/CQuest.h | 6 + lib/mapObjects/CRewardableConstructor.cpp | 2 +- lib/mapObjects/JsonRandom.cpp | 2 +- lib/mapObjects/MiscObjects.cpp | 51 +- lib/mapObjects/ObjectTemplate.cpp | 24 +- lib/mapObjects/ObjectTemplate.h | 9 + lib/mapping/CMap.cpp | 42 +- lib/mapping/CMap.h | 25 +- lib/mapping/CMapEditManager.cpp | 11 +- lib/mapping/CMapEditManager.h | 17 +- lib/mapping/MapFormatH3M.cpp | 93 +- lib/mapping/MapFormatH3M.h | 2 + lib/mapping/MapFormatJson.cpp | 598 +- lib/mapping/MapFormatJson.h | 20 +- lib/rmg/CRmgTemplateZone.cpp | 6 +- lib/serializer/CSerializer.h | 2 +- lib/serializer/JsonDeserializer.cpp | 158 +- lib/serializer/JsonDeserializer.h | 16 +- lib/serializer/JsonSerializeFormat.cpp | 182 +- lib/serializer/JsonSerializeFormat.h | 365 +- lib/serializer/JsonSerializer.cpp | 112 +- lib/serializer/JsonSerializer.h | 16 +- lib/spells/CSpellHandler.cpp | 2 +- test/CMakeLists.txt | 8 +- test/CMapFormatTest.cpp | 174 +- test/CVcmiTestConfig.cpp | 2 +- test/MapComparer.cpp | 205 +- test/MapComparer.h | 48 +- test/testdata/ObjectPropertyTest/header.json | 367 + .../ObjectPropertyTest/objects.ex.json | 7389 +++++++++++++++++ test/testdata/ObjectPropertyTest/objects.json | 7389 +++++++++++++++++ .../ObjectPropertyTest/surface_terrain.json | 144 + .../underground_terrain.json | 144 + test/{ => testdata}/TerrainViewTest.h3m | Bin test/{ => testdata}/terrainViewMappings.json | 0 70 files changed, 18728 insertions(+), 687 deletions(-) create mode 100644 config/factions/random.json create mode 100644 test/testdata/ObjectPropertyTest/header.json create mode 100644 test/testdata/ObjectPropertyTest/objects.ex.json create mode 100644 test/testdata/ObjectPropertyTest/objects.json create mode 100644 test/testdata/ObjectPropertyTest/surface_terrain.json create mode 100644 test/testdata/ObjectPropertyTest/underground_terrain.json rename test/{ => testdata}/TerrainViewTest.h3m (100%) rename test/{ => testdata}/terrainViewMappings.json (100%) diff --git a/AI/VCAI/Goals.cpp b/AI/VCAI/Goals.cpp index 5880c0185..666ba3b9a 100644 --- a/AI/VCAI/Goals.cpp +++ b/AI/VCAI/Goals.cpp @@ -327,6 +327,12 @@ TSubgoal Win::whatToDoToAchieve() break; // Should be only used in calculation of candidates (see toBool lambda) case EventCondition::CONST_VALUE: break; + + case EventCondition::HAVE_0: + case EventCondition::HAVE_BUILDING_0: + case EventCondition::DESTROY_0: + //TODO: support new condition format + return sptr (Goals::Conquer()); default: assert(0); } diff --git a/client/CPreGame.cpp b/client/CPreGame.cpp index 6359a66e7..8d87f4500 100644 --- a/client/CPreGame.cpp +++ b/client/CPreGame.cpp @@ -2512,9 +2512,9 @@ void OptionsTab::recreate() entries.insert(std::make_pair(it->first, new PlayerOptionsEntry(this, it->second))); const std::vector &heroes = SEL->current->mapHeader->players[it->first.getNum()].heroesNames; 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 ) diff --git a/config/factions/random.json b/config/factions/random.json new file mode 100644 index 000000000..ae5d61eb3 --- /dev/null +++ b/config/factions/random.json @@ -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" } + } + } + } +} diff --git a/lib/CArtHandler.cpp b/lib/CArtHandler.cpp index 450818ee5..3f6f96bce 100644 --- a/lib/CArtHandler.cpp +++ b/lib/CArtHandler.cpp @@ -23,6 +23,7 @@ #include "mapObjects/CObjectClassesHandler.h" #include "mapping/CMap.h" +#include "serializer/JsonSerializeFormat.h" // Note: list must match entries in ArtTraits.txt #define ART_POS_LIST \ @@ -1220,6 +1221,8 @@ bool CCombinedArtifactInstance::ConstituentInfo::operator==(const ConstituentInf return art == rhs.art && slot == rhs.slot; } +CArtifactSet::~CArtifactSet() = default; + const CArtifactInstance* CArtifactSet::getArt(ArtifactPosition pos, bool excludeLocked /*= true*/) const { if(const ArtSlotInfo *si = getSlot(pos)) @@ -1377,12 +1380,106 @@ void CArtifactSet::artDeserializationFix(CBonusSystemNode *node) 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 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 + } + } + } } diff --git a/lib/CArtHandler.h b/lib/CArtHandler.h index 56e12b75a..1e9d50b33 100644 --- a/lib/CArtHandler.h +++ b/lib/CArtHandler.h @@ -25,6 +25,7 @@ class CArtifactSet; class CArtifactInstance; class CRandomGenerator; class CMap; +class JsonSerializeFormat; #define ART_BEARER_LIST \ ART_BEARER(HERO)\ @@ -322,7 +323,8 @@ public: bool isPositionFree(ArtifactPosition pos, bool onlyLockCheck = false) const; virtual ArtBearer::ArtBearer bearerType() const = 0; - virtual ~CArtifactSet() = default; + virtual void putArtifact(ArtifactPosition pos, CArtifactInstance * art) = 0; + virtual ~CArtifactSet(); template void serialize(Handler &h, const int version) { @@ -331,10 +333,15 @@ public: void artDeserializationFix(CBonusSystemNode *node); + void serializeJsonArtifacts(JsonSerializeFormat & handler, const std::string & fieldName, CMap * map); protected: - void writeJson(JsonNode & json) const; - void readJson(const JsonNode & json); -protected: + std::pair 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 }; diff --git a/lib/CCreatureHandler.cpp b/lib/CCreatureHandler.cpp index 32ba33953..36fe19da1 100644 --- a/lib/CCreatureHandler.cpp +++ b/lib/CCreatureHandler.cpp @@ -460,6 +460,20 @@ std::vector CCreatureHandler::getDefaultAllowed() const 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() { if (VLC->modh->modules.STACK_EXP) //reading default stack experience bonuses diff --git a/lib/CCreatureHandler.h b/lib/CCreatureHandler.h index 7a42daecf..fd9262985 100644 --- a/lib/CCreatureHandler.h +++ b/lib/CCreatureHandler.h @@ -216,6 +216,12 @@ public: std::vector getDefaultAllowed() const override; + ///json serialization helper + static si32 decodeCreature(const std::string & identifier); + + ///json serialization helper + static std::string encodeCreature(const si32 index); + template void serialize(Handler &h, const int version) { //TODO: should be optimized, not all these informations needs to be serialized (same for ccreature) diff --git a/lib/CCreatureSet.cpp b/lib/CCreatureSet.cpp index e4fa37b9c..3bcb29296 100644 --- a/lib/CCreatureSet.cpp +++ b/lib/CCreatureSet.cpp @@ -12,6 +12,7 @@ #include "CHeroHandler.h" #include "IBonusTypeHandler.h" #include "serializer/JsonSerializeFormat.h" +#include "NetPacksBase.h" /* * 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 fixedSize) { if(handler.saving && stacks.empty()) return; - JsonNode & json = handler.getCurrent()[fieldName]; + + auto a = handler.enterArray(fieldName); + 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) { - JsonNode stack_node; - p.second->writeJson(stack_node); - json.Vector()[p.first.getNum()] = stack_node; + auto s = a.enterStruct(p.first.getNum()); + p.second->serializeJson(handler); } } 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(); - - new_stack->readJson(json.Vector()[idx]); - + new_stack->serializeJson(handler); putStack(SlotID(idx), new_stack); } } @@ -624,7 +640,8 @@ void CStackInstance::setType(const CCreature *c) experience *= VLC->creh->expAfterUpgrade / 100.0; } - type = c; + CStackBasicDescriptor::setType(c); + if(type) attachTo(const_cast(type)); } @@ -733,23 +750,43 @@ ArtBearer::ArtBearer CStackInstance::bearerType() const return ArtBearer::CREATURE; } -void CStackInstance::writeJson(JsonNode& json) const +void CStackInstance::putArtifact(ArtifactPosition pos, CArtifactInstance * art) { - if(idRand > -1) - { - json["level"].Float() = (int)idRand / 2; - json["upgraded"].Bool() = (idRand % 2) > 0; - } - CStackBasicDescriptor::writeJson(json); + assert(!getArt(pos)); + art->putAt(ArtifactLocation(this, pos)); } -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() @@ -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); - if(type) - json["type"].String() = type->identifier; - json["amount"].Float() = count; + type = c; } -void CStackBasicDescriptor::readJson(const JsonNode& json) +void CStackBasicDescriptor::serializeJson(JsonSerializeFormat & handler) { - auto typeName = json["type"].String(); - if(typeName != "") - type = VLC->creh->getCreature("core", json["type"].String()); - count = json["amount"].Float(); + handler.serializeInt("amount", count); + + if(handler.saving) + { + 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) diff --git a/lib/CCreatureSet.h b/lib/CCreatureSet.h index 99fb252bf..b5264dd33 100644 --- a/lib/CCreatureSet.h +++ b/lib/CCreatureSet.h @@ -32,14 +32,14 @@ public: CStackBasicDescriptor(const CCreature *c, TQuantity Count); virtual ~CStackBasicDescriptor() = default; + virtual void setType(const CCreature * c); + template void serialize(Handler &h, const int version) { h & type & count; } - void writeJson(JsonNode & json) const; - - void readJson(const JsonNode & json); + void serializeJson(JsonSerializeFormat & handler); }; class DLL_LINKAGE CStackInstance : public CBonusSystemNode, public CStackBasicDescriptor, public CArtifactSet @@ -65,9 +65,7 @@ public: BONUS_TREE_DESERIALIZATION_FIX } - void writeJson(JsonNode & json) const; - - void readJson(const JsonNode & json); + void serializeJson(JsonSerializeFormat & handler); //overrides CBonusSystemNode std::string bonusToString(const std::shared_ptr& bonus, bool description) const override; // how would bonus description look for this particular type of node @@ -88,10 +86,11 @@ public: virtual ~CStackInstance(); void setType(CreatureID creID); - void setType(const CCreature *c); + void setType(const CCreature * c) override; void setArmyObj(const CArmedInstance *ArmyObj); virtual void giveStackExp(TExpType exp); bool valid(bool allowUnrandomized) const; + void putArtifact(ArtifactPosition pos, CArtifactInstance * art) override;//from CArtifactSet ArtBearer::ArtBearer bearerType() const override; //from CArtifactSet virtual std::string nodeName() const override; //from CBonusSystemnode void deserializationFix(); @@ -222,7 +221,7 @@ public: h & stacks & formation; } - void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName); + void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName, const boost::optional fixedSize = boost::none); operator bool() const { diff --git a/lib/CGameInfoCallback.cpp b/lib/CGameInfoCallback.cpp index 24785cfd5..bb334d85b 100644 --- a/lib/CGameInfoCallback.cpp +++ b/lib/CGameInfoCallback.cpp @@ -99,8 +99,16 @@ const CTown * CGameInfoCallback::getNativeTown(PlayerColor color) 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); - return getObj(gs->map->questIdentifierToId[identifier]); + if(gs->map->questIdentifierToId.empty()) + { + //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]); + } } /************************************************************************/ diff --git a/lib/CGameState.cpp b/lib/CGameState.cpp index af18f26cd..d5a8cfce0 100644 --- a/lib/CGameState.cpp +++ b/lib/CGameState.cpp @@ -510,8 +510,29 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) if (auto info = dynamic_cast(dwl->info)) { 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) { if(!elem) @@ -534,12 +555,16 @@ std::pair CGameState::pickObject (CGObjectInstance *obj) } else { - while(!(info->castles[0]&(1<7) && (info->castles[1]&(1<<(faction-8)))) - break; - faction = getRandomGenerator().nextInt(GameConstants::F_NUMBER - 1); - } + std::set temp; + + for(int i = 0; i < info->allowedFactions.size(); i++) + if(info->allowedFactions[i]) + 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 @@ -1119,7 +1144,7 @@ void CGameState::placeCampaignHeroes() hero->subID = heroTypeId; 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) { - townPos.x += 1; + townPos.x -= 2; //FIXME: use actual visitable offset of town - CGHeroInstance * hero = static_cast(createObject(Obj::HERO, heroTypeId.getNum(), townPos, playerColor)); - map->getEditManager()->insertObject(hero, townPos); + CGObjectInstance * hero = createObject(Obj::HERO, heroTypeId.getNum(), townPos, playerColor); + hero->pos += hero->getVisitableOffset(); + map->getEditManager()->insertObject(hero); } CGameState::CrossoverHeroesList CGameState::getCrossoverHeroesFromPreviousScenarios() const @@ -1651,7 +1677,7 @@ void CGameState::initTowns() PlayerInfo & pi = map->players[owner->color.getNum()]; 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( 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 } + 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 @@ -3126,7 +3171,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname) i++; } - if(n["heroid"].getType() == JsonNode::DATA_FLOAT) + if(n["heroid"].isNumber()) ss.heroId = n["heroid"].Float(); else ss.heroId = -1; @@ -3169,7 +3214,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname) } else { - assert(n.getType() == JsonNode::DATA_FLOAT); + assert(n.isNumber()); oi->ID = 21; oi->pos = n.Float(); } @@ -3183,7 +3228,7 @@ DuelParameters DuelParameters::fromJSON(const std::string &fname) cc.id = n["id"].Float(); #define retrieve(name) \ - if(n[ #name ].getType() == JsonNode::DATA_FLOAT)\ + if(n[ #name ].isNumber())\ cc.name = n[ #name ].Float(); \ else \ cc.name = -1; diff --git a/lib/CHeroHandler.cpp b/lib/CHeroHandler.cpp index 02c08b1af..1489dc349 100644 --- a/lib/CHeroHandler.cpp +++ b/lib/CHeroHandler.cpp @@ -281,6 +281,7 @@ CHeroHandler::CHeroHandler() for (int i = 0; i < GameConstants::SKILL_QUANTITY; ++i) { VLC->modh->identifiers.registerObject("core", "skill", NSecondarySkill::names[i], i); + VLC->modh->identifiers.registerObject("core", "secondarySkill", NSecondarySkill::names[i], i); } loadObstacles(); loadTerrains(); @@ -542,7 +543,7 @@ void CHeroHandler::loadObject(std::string scope, std::string name, const JsonNod { auto object = loadFromJson(data, normalizeIdentifier(scope, "core", name)); 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); diff --git a/lib/CModHandler.cpp b/lib/CModHandler.cpp index 6d26f26a1..0a5395290 100644 --- a/lib/CModHandler.cpp +++ b/lib/CModHandler.cpp @@ -181,6 +181,20 @@ boost::optional CIdentifierStorage::getIdentifier(const JsonNode & name, b return boost::optional(); } +boost::optional CIdentifierStorage::getIdentifier(std::string scope, std::string fullName, bool silent) +{ + auto pair = splitString(fullName, ':'); // remoteScope: + auto pair2 = splitString(pair.second, '.'); // type.name + auto idList = getPossibleIdentifiers(ObjectCallback(scope, pair.first, pair2.first, pair2.second, std::function(), 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(); +} + void CIdentifierStorage::registerObject(std::string scope, std::string type, std::string name, si32 identifier) { ObjectData data; @@ -387,6 +401,12 @@ bool CContentHandler::ContentTypeHandler::loadMod(std::string modName, bool vali return result; } + +void CContentHandler::ContentTypeHandler::loadCustom() +{ + handler->loadCustom(); +} + void CContentHandler::ContentTypeHandler::afterLoadFinalization() { handler->afterLoadFinalization(); @@ -426,6 +446,14 @@ bool CContentHandler::loadMod(std::string modName, bool validate) return result; } +void CContentHandler::loadCustom() +{ + for(auto & handler : handlers) + { + handler.second.loadCustom(); + } +} + void CContentHandler::afterLoadFinalization() { for(auto & handler : handlers) @@ -574,8 +602,10 @@ CModHandler::CModHandler() } for(int i=0; iinfoStream() << "\tLoading mod data: " << timer.getDiff() << "ms"; VLC->creh->loadCrExpBon(); @@ -946,7 +978,7 @@ void CModHandler::afterLoad() 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, ':'); @@ -956,5 +988,35 @@ std::string CModHandler::normalizeIdentifier(const std::string & scope, const st if(p.first == remoteScope) 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; } diff --git a/lib/CModHandler.h b/lib/CModHandler.h index 1a8df6e63..5213ebf97 100644 --- a/lib/CModHandler.h +++ b/lib/CModHandler.h @@ -89,6 +89,7 @@ public: boost::optional getIdentifier(std::string scope, std::string type, std::string name, bool silent = false); boost::optional getIdentifier(std::string type, const JsonNode & name, bool silent = false); boost::optional getIdentifier(const JsonNode & name, bool silent = false); + boost::optional getIdentifier(std::string scope, std::string fullName, bool silent = false); /// registers new object 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 bool preloadModData(std::string modName, std::vector fileList, bool validate); bool loadMod(std::string modName, bool validate); + void loadCustom(); void afterLoadFinalization(); }; @@ -152,6 +154,8 @@ public: /// actually loads data in mod void load(CModInfo & mod); + void loadCustom(); + /// all data was loaded, time for final validation / integration void afterLoadFinalization(); }; @@ -297,7 +301,11 @@ public: 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 void serialize(Handler &h, const int version) { diff --git a/lib/CTownHandler.cpp b/lib/CTownHandler.cpp index 2ac384ceb..5f75b59bf 100644 --- a/lib/CTownHandler.cpp +++ b/lib/CTownHandler.cpp @@ -82,7 +82,7 @@ CFaction::~CFaction() CTown::CTown() : faction(nullptr), mageLevel(0), primaryRes(0), moatDamage(0), defaultTavernChance(0) { - + faction = nullptr; } CTown::~CTown() @@ -100,13 +100,47 @@ std::vector CTown::defaultMoatHexes() 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 CTown::getAllBuildings() const +{ + std::set res; + + for(const auto & b : buildings) + { + res.insert(b.first.num); + } + + return std::move(res); +} + + CTownHandler::CTownHandler() { VLC->townh = this; + + randomTown = new CTown(); } CTownHandler::~CTownHandler() { + delete randomTown; + for(auto faction : factions) faction.dellNull(); } @@ -120,8 +154,6 @@ JsonNode readBuilding(CLegacyConfigParser & parser) for(const std::string & resID : GameConstants::RESOURCE_NAMES) cost[resID].Float() = parser.readNumber(); - - cost.Struct().erase("mithril"); // erase mithril to avoid confusing validator parser.endLine(); @@ -283,28 +315,28 @@ std::vector CTownHandler::loadLegacyData(size_t dataSize) return dest; } -void CTownHandler::loadBuildingRequirements(CTown &town, CBuilding & building, const JsonNode & source) +void CTownHandler::loadBuildingRequirements(CBuilding * building, const JsonNode & source) { if (source.isNull()) return; BuildingRequirementsHelper hlp; - hlp.building = &building; - hlp.faction = town.faction; + hlp.building = building; + hlp.town = building->town; hlp.json = source; 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"}; ret->mode = static_cast(boost::find(modes, source["mode"].String()) - modes); ret->identifier = stringID; - ret->town = &town; + ret->town = town; ret->bid = BuildingID(source["id"].Float()); ret->name = source["name"].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()) { @@ -347,10 +379,10 @@ void CTownHandler::loadBuilding(CTown &town, const std::string & stringID, const 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.") % - 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); }); @@ -358,13 +390,14 @@ void CTownHandler::loadBuilding(CTown &town, const std::string & stringID, const else ret->upgrade = BuildingID::NONE; - town.buildings[ret->bid] = ret; - VLC->modh->identifiers.registerObject(source.meta, "building." + town.faction->identifier, ret->identifier, ret->bid); + ret->town->buildings[ret->bid] = ret; + + 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()) { @@ -624,7 +657,7 @@ void CTownHandler::loadTown(CTown &town, const JsonNode & source) town.dwellingNames.push_back (d["name"].String()); } - loadBuildings(town, source["buildings"]); + loadBuildings(&town, source["buildings"]); 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); } +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() { initializeRequirements(); @@ -773,7 +820,7 @@ void CTownHandler::initializeRequirements() logGlobal->warnStream() << "Unexpected length of town buildings requirements: " << node.Vector().size(); 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(); @@ -788,6 +835,7 @@ std::vector CTownHandler::getDefaultAllowed() const } return allowedFactions; } + std::set CTownHandler::getAllowedFactions(bool withTown /*=true*/) const { std::set allowedFactions; diff --git a/lib/CTownHandler.h b/lib/CTownHandler.h index 32c10497f..c08be54c9 100644 --- a/lib/CTownHandler.h +++ b/lib/CTownHandler.h @@ -143,6 +143,10 @@ public: // TODO: remove once save and mod compatability not needed static std::vector defaultMoatHexes(); + std::string getFactionName() const; + std::string getBuildingScope() const; + std::set getAllBuildings() const; + CFaction * faction; std::vector names; //names of the town instances @@ -222,16 +226,6 @@ public: moatHexes = defaultMoatHexes(); } h & defaultTavernChance; - - auto findNull = [](const std::pair> &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; CBuilding * building; - CFaction * faction; + CTown * town; }; std::vector requirementsToLoad; void initializeRequirements(); /// loads CBuilding's into town - void loadBuildingRequirements(CTown &town, CBuilding & building, const JsonNode & source); - void loadBuilding(CTown &town, const std::string & stringID, const JsonNode & source); - void loadBuildings(CTown &town, const JsonNode & source); + void loadBuildingRequirements(CBuilding * building, const JsonNode & source); + void loadBuilding(CTown * town, const std::string & stringID, const JsonNode & source); + void loadBuildings(CTown * town, const JsonNode & source); /// loads CStructure's into town 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); + void loadRandomFaction(); public: std::vector > factions; + CTown * randomTown; + CTownHandler(); //c-tor, set pointer in VLC to this ~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, size_t index) override; + void loadCustom() override; void afterLoadFinalization() override; std::vector getDefaultAllowed() const override; @@ -293,5 +291,14 @@ public: template void serialize(Handler &h, const int version) { h & factions; + + if(version >= 770) + { + h & randomTown; + } + else if(!h.saving) + { + loadRandomFaction(); + } } }; diff --git a/lib/GameConstants.h b/lib/GameConstants.h index e46bf2d39..4d48ec186 100644 --- a/lib/GameConstants.h +++ b/lib/GameConstants.h @@ -54,11 +54,14 @@ namespace GameConstants const int CREATURES_COUNT = 197; 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 CArtifactInstance; class CCreature; +class CHero; class CSpell; class CGameInfoCallback; class CNonConstInfoCallback; @@ -203,7 +206,6 @@ class ArtifactInstanceID : public BaseForID friend class CNonConstInfoCallback; }; - class QueryID : public BaseForID { INSTID_LIKE_CLASS_COMMON(QueryID, si32) @@ -223,7 +225,6 @@ class ObjectInstanceID : public BaseForID friend class CNonConstInfoCallback; }; - class HeroTypeID : public BaseForID { INSTID_LIKE_CLASS_COMMON(HeroTypeID, si32) @@ -1067,6 +1068,26 @@ enum class ESpellSchool: ui8 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 ui8 TFaction; typedef si64 TExpType; diff --git a/lib/IGameCallback.h b/lib/IGameCallback.h index ed1115d1d..421735c54 100644 --- a/lib/IGameCallback.h +++ b/lib/IGameCallback.h @@ -51,7 +51,7 @@ public: virtual void setBlockVis(ObjectInstanceID objid, bool bv)=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 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 showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) =0; //cb will be called when player closes garrison window virtual void showTeleportDialog(TeleportDialog *iw) =0; @@ -94,7 +94,6 @@ public: virtual void changeObjPos(ObjectInstanceID objid, int3 newPos, ui8 flags)=0; virtual void sendAndApply(CPackForClient * info)=0; 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(std::unordered_set &tiles, PlayerColor player, bool hide) = 0; }; diff --git a/lib/IHandlerBase.h b/lib/IHandlerBase.h index c11a91be8..4d47988d6 100644 --- a/lib/IHandlerBase.h +++ b/lib/IHandlerBase.h @@ -39,6 +39,9 @@ public: /// allows handlers to alter object configuration before validation and actual load 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 virtual void afterLoadFinalization(){}; diff --git a/lib/JsonDetail.cpp b/lib/JsonDetail.cpp index 6b01614d2..599c5f928 100644 --- a/lib/JsonDetail.cpp +++ b/lib/JsonDetail.cpp @@ -60,17 +60,17 @@ void JsonWriter::writeEntry(JsonVector::const_iterator entry) void JsonWriter::writeString(const std::string &string) { - static const std::string escaped = "\"\\\b\f\n\r\t"; - - static const std::array escaped_code = {'\"', '\\', 'b', 'f', 'n', 'r', 't'}; - + static const std::string escaped = "\"\\\b\f\n\r\t/"; + + static const std::array escaped_code = {'\"', '\\', 'b', 'f', 'n', 'r', 't', '/'}; + out <<'\"'; size_t pos=0, start=0; for (; pos= '0' && input[pos] <= '9')); bool negative=false; double result=0; + si64 integerPart = 0; + bool isFloat = false; if (input[pos] == '-') { @@ -471,13 +476,16 @@ bool JsonParser::extractFloat(JsonNode &node) //Extract integer part while (input[pos] >= '0' && input[pos] <= '9') { - result = result*10+(input[pos]-'0'); + integerPart = integerPart*10+(input[pos]-'0'); pos++; } + result = integerPart; + if (input[pos] == '.') { //extract fractional part + isFloat = true; pos++; double fractMult = 0.1; if (input[pos] < '0' || input[pos] > '9') @@ -490,12 +498,57 @@ bool JsonParser::extractFloat(JsonNode &node) pos++; } } - //TODO: exponential part - if (negative) - result = -result; - node.setType(JsonNode::DATA_FLOAT); - node.Float() = result; + if(input[pos] == 'e') + { + //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; } @@ -513,13 +566,15 @@ bool JsonParser::error(const std::string &message, bool warning) /////////////////////////////////////////////////////////////////////////////// +//TODO: integer support + static const std::unordered_map stringToType = { - {"null", JsonNode::DATA_NULL}, + {"null", JsonNode::DATA_NULL}, {"boolean", JsonNode::DATA_BOOL}, - {"number", JsonNode::DATA_FLOAT}, + {"number", JsonNode::DATA_FLOAT}, {"string", JsonNode::DATA_STRING}, - {"array", JsonNode::DATA_VECTOR}, + {"array", JsonNode::DATA_VECTOR}, {"object", JsonNode::DATA_STRUCT} }; @@ -612,8 +667,13 @@ namespace { return validator.makeErrorMessage("Unknown type in schema:" + typeName); } - + 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) return validator.makeErrorMessage("Type mismatch! Expected " + schema.String()); return ""; @@ -969,7 +1029,7 @@ namespace return testAnimation(node.String().substr(0, node.String().find(':')), node.meta); return "Image file \"" + node.String() + "\" was not found"; } - + std::string videoFile(const JsonNode & node) { TEST_FILE(node.meta, "Video/", node.String(), EResType::VIDEO); @@ -1128,7 +1188,9 @@ namespace Validation 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_VECTOR: return vectorFields; case JsonNode::DATA_STRUCT: return structFields; diff --git a/lib/JsonNode.cpp b/lib/JsonNode.cpp index 026dcffbf..1a91d187e 100644 --- a/lib/JsonNode.cpp +++ b/lib/JsonNode.cpp @@ -83,11 +83,12 @@ JsonNode::JsonNode(const JsonNode ©): switch(type) { break; case DATA_NULL: - break; case DATA_BOOL: Bool() = copy.Bool(); - break; case DATA_FLOAT: Float() = copy.Float(); - break; case DATA_STRING: String() = copy.String(); - break; case DATA_VECTOR: Vector() = copy.Vector(); - break; case DATA_STRUCT: Struct() = copy.Struct(); + break; case DATA_BOOL: Bool() = copy.Bool(); + break; case DATA_FLOAT: Float() = copy.Float(); + break; case DATA_STRING: String() = copy.String(); + break; case DATA_VECTOR: Vector() = copy.Vector(); + 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_VECTOR: return Vector() == other.Vector(); case DATA_STRUCT: return Struct() == other.Struct(); + case DATA_INTEGER:return Integer()== other.Integer(); } } return false; @@ -167,6 +169,22 @@ void JsonNode::setType(JsonType Type) if (type == Type) 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 if (Type != 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_VECTOR: data.Vector = new JsonVector(); 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; } +bool JsonNode::isNumber() const +{ + return type == DATA_INTEGER || type == DATA_FLOAT; +} + void JsonNode::clear() { setType(DATA_NULL); @@ -214,6 +238,12 @@ double & JsonNode::Float() return data.Float; } +si64 & JsonNode::Integer() +{ + setType(DATA_INTEGER); + return data.Integer; +} + std::string & JsonNode::String() { setType(DATA_STRING); @@ -233,7 +263,7 @@ JsonMap & JsonNode::Struct() } const bool boolDefault = false; -const bool & JsonNode::Bool() const +bool JsonNode::Bool() const { if (type == DATA_NULL) return boolDefault; @@ -242,14 +272,29 @@ const bool & JsonNode::Bool() const } const double floatDefault = 0; -const double & JsonNode::Float() const +double JsonNode::Float() const { - if (type == DATA_NULL) + if(type == DATA_NULL) return floatDefault; + else if(type == DATA_INTEGER) + return data.Integer; + assert(type == 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 & JsonNode::String() const { @@ -385,6 +430,9 @@ void JsonUtils::resolveIdentifier(si32 &var, const JsonNode &node, std::string n { switch (value.getType()) { + case JsonNode::DATA_INTEGER: + var = value.Integer(); + break; case JsonNode::DATA_FLOAT: var = value.Float(); break; @@ -404,6 +452,9 @@ void JsonUtils::resolveIdentifier(const JsonNode &node, si32 &var) { switch (node.getType()) { + case JsonNode::DATA_INTEGER: + var = node.Integer(); + break; case JsonNode::DATA_FLOAT: var = node.Float(); break; @@ -738,6 +789,7 @@ void JsonUtils::merge(JsonNode & dest, JsonNode & source) } case JsonNode::DATA_BOOL: case JsonNode::DATA_FLOAT: + case JsonNode::DATA_INTEGER: case JsonNode::DATA_STRING: case JsonNode::DATA_VECTOR: { diff --git a/lib/JsonNode.h b/lib/JsonNode.h index 14ac9d2cc..9305afc7a 100644 --- a/lib/JsonNode.h +++ b/lib/JsonNode.h @@ -29,7 +29,8 @@ public: DATA_FLOAT, DATA_STRING, DATA_VECTOR, - DATA_STRUCT + DATA_STRUCT, + DATA_INTEGER }; private: @@ -40,6 +41,7 @@ private: std::string* String; JsonVector* Vector; JsonMap* Struct; + si64 Integer; }; JsonType type; @@ -75,19 +77,24 @@ public: JsonType getType() const; bool isNull() const; + bool isNumber() const; /// removes all data from node and sets type to null void clear(); /// non-const accessors, node will change type on type mismatch bool & Bool(); double & Float(); + si64 & Integer(); std::string & String(); JsonVector & Vector(); JsonMap & Struct(); /// const accessors, will cause assertion failure on type mismatch - const bool & Bool() const; - const double & Float() const; + bool Bool() const; + ///float and integer allowed + double Float() const; + ///only integer allowed + si64 Integer() const; const std::string & String() const; const JsonVector & Vector() const; const JsonMap & Struct() const; @@ -118,6 +125,11 @@ public: break; case DATA_VECTOR: h & data.Vector; break; case DATA_STRUCT: h & data.Struct; } + if(version >= 770) + { + if(type == DATA_INTEGER) + h & data.Integer; + } } }; diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index 498f26d0e..8ef51c747 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -451,12 +451,12 @@ DLL_LINKAGE void RemoveObject::applyGs(CGameState *gs) { 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.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.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 res = elem.healedHP / changedStack->MaxHealth(); 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; if(elem.lowLevelResurrection) changedStack->resurrected += res; diff --git a/lib/ResourceSet.cpp b/lib/ResourceSet.cpp index 8233e777d..a47a6fb59 100644 --- a/lib/ResourceSet.cpp +++ b/lib/ResourceSet.cpp @@ -12,6 +12,7 @@ #include "ResourceSet.h" #include "StringConstants.h" #include "JsonNode.h" +#include "serializer/JsonSerializeFormat.h" Res::ResourceSet::ResourceSet() { @@ -25,6 +26,19 @@ Res::ResourceSet::ResourceSet(const JsonNode & node) 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 { for(auto & elem : *this) diff --git a/lib/ResourceSet.h b/lib/ResourceSet.h index deb0aadf5..b8c2c123d 100644 --- a/lib/ResourceSet.h +++ b/lib/ResourceSet.h @@ -14,6 +14,7 @@ typedef si32 TResource; typedef si64 TResourceCap; //to avoid overflow when adding integers. Signed values are easier to control. class JsonNode; +class JsonSerializeFormat; namespace Res { @@ -124,6 +125,8 @@ namespace Res h & static_cast&>(*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 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 diff --git a/lib/StringConstants.h b/lib/StringConstants.h index 78fa1a8d8..48a8fca3d 100644 --- a/lib/StringConstants.h +++ b/lib/StringConstants.h @@ -53,7 +53,7 @@ namespace NSecondarySkill "sorcery", "resistance", "firstAid" }; - const std::string levels [4] = + const std::vector levels = { "none", "basic", "advanced", "expert" }; @@ -87,7 +87,7 @@ namespace ETownType namespace NArtifactPosition { - const std::string names [19] = + const std::string namesHero [19] = { "head", "shoulders", "neck", "rightHand", "leftHand", "torso", //5 "rightRing", "leftRing", "feet", //8 @@ -96,5 +96,27 @@ namespace NArtifactPosition "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"; } + +namespace NMetaclass +{ + const std::string names [16] = + { + "", + "artifact", "creature", "faction", "experience", "hero", + "heroClass", "luck", "mana", "morale", "movement", + "object", "primarySkill", "secondarySkill", "spell", "resource" + }; +} diff --git a/lib/mapObjects/CGHeroInstance.cpp b/lib/mapObjects/CGHeroInstance.cpp index fcc131a1e..dce81b45f 100644 --- a/lib/mapObjects/CGHeroInstance.cpp +++ b/lib/mapObjects/CGHeroInstance.cpp @@ -26,6 +26,7 @@ #include "../mapping/CMap.h" #include "CGTownInstance.h" #include "../serializer/JsonSerializeFormat.h" +#include "../StringConstants.h" ///helpers 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); } -void CGHeroInstance::serializeJsonOptions(JsonSerializeFormat& handler) +std::string CGHeroInstance::getHeroTypeName() const { - serializeJsonOwner(handler); - - if(handler.saving) + if(ID == Obj::HERO || ID == Obj::PRISON) { if(type) { - handler.serializeString("type", type->identifier); + return type->identifier; } else { - auto temp = VLC->heroh->heroes[subID]->identifier; - handler.serializeString("type", temp); + return VLC->heroh->heroes[subID]->identifier; + } + } + 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("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(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 { - 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; - handler.serializeString("type", typeName); + secSkills.push_back(std::pair(SecondarySkill::DEFAULT, -1)); + } + 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) - subID = rawId.get(); - else - subID = 0; //fallback to Orrin, throw error instead? + const int level = vstd::find_pos(NSecondarySkill::levels, levelId); + if(level < 0) + { + logGlobal->errorStream() << "Invalid secondary skill level" << levelId; + continue; + } + + secSkills.push_back(std::pair(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) - CArtifactSet::writeJson(handler.getCurrent()); - else - CArtifactSet::readJson(handler.getCurrent()); + typeName = getHeroTypeName(); + handler.serializeString("type", typeName); + if(!handler.saving) + setHeroTypeName(typeName); } + CCreatureSet::serializeJson(handler, "army", 7); + handler.serializeBool("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 @@ -1591,7 +1770,7 @@ bool CGHeroInstance::isMissionCritical() const { 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(condition.object); return (hero != this); diff --git a/lib/mapObjects/CGHeroInstance.h b/lib/mapObjects/CGHeroInstance.h index 6cf2552a9..3fbd03624 100644 --- a/lib/mapObjects/CGHeroInstance.h +++ b/lib/mapObjects/CGHeroInstance.h @@ -65,8 +65,8 @@ public: ConstTransitivePtr commander; const CGBoat *boat; //set to CGBoat when sailing - static const ui32 UNINITIALIZED_PORTRAIT = -1; - static const ui32 UNINITIALIZED_MANA = -1; + static const si32 UNINITIALIZED_PORTRAIT = -1; + static const si32 UNINITIALIZED_MANA = -1; static const ui32 UNINITIALIZED_MOVEMENT = -1; //std::vector artifacts; //hero's artifacts from bag @@ -204,7 +204,7 @@ public: void initHero(CRandomGenerator & rand); void initHero(CRandomGenerator & rand, HeroTypeID SUBID); - void putArtifact(ArtifactPosition pos, CArtifactInstance *art); + void putArtifact(ArtifactPosition pos, CArtifactInstance * art) override; void putInBackpack(CArtifactInstance *art); void initExp(CRandomGenerator & rand); void initArmy(CRandomGenerator & rand, IArmyDescriptor *dst = nullptr); @@ -258,12 +258,20 @@ public: std::string getObjectName() const override; protected: 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; private: void levelUpAutomatically(CRandomGenerator & rand); public: + std::string getHeroTypeName() const; + void setHeroTypeName(const std::string & identifier); + + void serializeJsonDefinition(JsonSerializeFormat & handler); + template void serialize(Handler &h, const int version) { h & static_cast(*this); diff --git a/lib/mapObjects/CGPandoraBox.cpp b/lib/mapObjects/CGPandoraBox.cpp index 643d8d7a1..49340301f 100644 --- a/lib/mapObjects/CGPandoraBox.cpp +++ b/lib/mapObjects/CGPandoraBox.cpp @@ -17,6 +17,8 @@ #include "../spells/CSpellHandler.h" #include "../StartInfo.h" #include "../IGameCallback.h" +#include "../StringConstants.h" +#include "../serializer/JsonSerializeFormat.h" ///helpers 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 { if(!(availableFor & (1 << h->tempOwner.getNum()))) @@ -416,3 +497,26 @@ void CGEvent::afterSuccessfulVisit() const else if(hasGuardians) hasGuardians = false; } + +void CGEvent::serializeJsonOptions(JsonSerializeFormat & handler) +{ + CGPandoraBox::serializeJsonOptions(handler); + + handler.serializeBool("aIActivable", computerActivate, true, false, false); + handler.serializeBool("humanActivable", humanActivate, true, false, true); + handler.serializeBool("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("availableFor", availableFor, GameConstants::ALL_PLAYERS, decodePlayer, encodePlayer); + } +} diff --git a/lib/mapObjects/CGPandoraBox.h b/lib/mapObjects/CGPandoraBox.h index a38df2847..58af67ffc 100644 --- a/lib/mapObjects/CGPandoraBox.h +++ b/lib/mapObjects/CGPandoraBox.h @@ -51,6 +51,7 @@ public: protected: void giveContentsUpToExp(const CGHeroInstance *h) const; void giveContentsAfterExp(const CGHeroInstance *h) const; + void serializeJsonOptions(JsonSerializeFormat & handler) override; private: 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; @@ -73,6 +74,8 @@ public: CGEvent(); void onHeroVisit(const CGHeroInstance * h) const override; +protected: + void serializeJsonOptions(JsonSerializeFormat & handler) override; private: void activated(const CGHeroInstance * h) const; void afterSuccessfulVisit() const override; diff --git a/lib/mapObjects/CGTownInstance.cpp b/lib/mapObjects/CGTownInstance.cpp index 2ca352ce8..b1f478c40 100644 --- a/lib/mapObjects/CGTownInstance.cpp +++ b/lib/mapObjects/CGTownInstance.cpp @@ -25,6 +25,64 @@ std::vector CGTownInstance::merchantArtifacts; std::vector CGTownInstance::universitySkills; +void CCreGenAsCastleInfo::serializeJson(JsonSerializeFormat & handler) +{ + handler.serializeString("sameAsTown", instanceId); + + if(!handler.saving) + { + asCastle = (instanceId != ""); + allowedFactions.clear(); + } + + if(!asCastle) + { + std::vector 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) { 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) { switch (what) @@ -318,9 +393,24 @@ void CGDwelling::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) void CGDwelling::serializeJsonOptions(JsonSerializeFormat & handler) { - //todo: CGDwelling::serializeJsonOptions - if(ID != Obj::WAR_MACHINE_FACTORY && ID != Obj::REFUGEE_CAMP) + if(!handler.saving) + 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); + break; + } } int CGTownInstance::getSightRadius() const //returns sight distance @@ -495,7 +585,7 @@ bool CGTownInstance::hasCapitol() const return hasBuilt(BuildingID::CAPITOL); } 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; } +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 { // count all buildings that are not upgrades @@ -1214,34 +1319,100 @@ void CGTownInstance::battleFinished(const CGHeroInstance *hero, const BattleResu void CGTownInstance::serializeJsonOptions(JsonSerializeFormat & handler) { CGObjectInstance::serializeJsonOwner(handler); - CCreatureSet::serializeJson(handler, "army"); - handler.serializeBool("tightFormation", 1, 0, formation); + CCreatureSet::serializeJson(handler, "army", 7); + handler.serializeBool("tightFormation", formation, 1, 0, 0); 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 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 standard; -// standard.resize(44, true); -// -// -// JsonSerializeFormat::LIC buildingsLIC(, CTownHandler::decodeBuilding, CTownHandler::encodeBuilding); -// } - { - JsonSerializeFormat::LIC spellsLIC(VLC->spellh->getDefaultAllowed(), CSpellHandler::decodeSpell, CSpellHandler::encodeSpell); + std::vector standard = VLC->spellh->getDefaultAllowed(); + JsonSerializeFormat::LIC spellsLIC(standard, CSpellHandler::decodeSpell, CSpellHandler::encodeSpell); - for(SpellID id : possibleSpells) - spellsLIC.any[id.num] = true; + if(handler.saving) + { + for(SpellID id : possibleSpells) + spellsLIC.any[id.num] = true; - for(SpellID id : obligatorySpells) - spellsLIC.all[id.num] = true; + for(SpellID id : obligatorySpells) + spellsLIC.all[id.num] = true; + } handler.serializeLIC("spells", spellsLIC); @@ -1251,18 +1422,14 @@ void CGTownInstance::serializeJsonOptions(JsonSerializeFormat & handler) for(si32 idx = 0; idx < spellsLIC.any.size(); idx++) { if(spellsLIC.any[idx]) - { possibleSpells.push_back(SpellID(idx)); - } } obligatorySpells.clear(); for(si32 idx = 0; idx < spellsLIC.all.size(); idx++) { if(spellsLIC.all[idx]) - { obligatorySpells.push_back(SpellID(idx)); - } } } } diff --git a/lib/mapObjects/CGTownInstance.h b/lib/mapObjects/CGTownInstance.h index c98bbccdb..faaea8cae 100644 --- a/lib/mapObjects/CGTownInstance.h +++ b/lib/mapObjects/CGTownInstance.h @@ -18,30 +18,46 @@ class CCastleEvent; class CGTownInstance; +class CGDwelling; class DLL_LINKAGE CSpecObjInfo { public: - virtual ~CSpecObjInfo(){}; - PlayerColor player; //owner + CSpecObjInfo() = default; + virtual ~CSpecObjInfo() = default; + + virtual void serializeJson(JsonSerializeFormat & handler) = 0; + + const CGDwelling * owner; }; class DLL_LINKAGE CCreGenAsCastleInfo : public virtual CSpecObjInfo { public: + CCreGenAsCastleInfo() = default; bool asCastle; - ui32 identifier; - ui8 castles[2]; //allowed castles + ui32 identifier;//h3m internal identifier + + std::vector allowedFactions; + + std::string instanceId;//vcmi map instance identifier + void serializeJson(JsonSerializeFormat & handler) override; }; class DLL_LINKAGE CCreGenLeveledInfo : public virtual CSpecObjInfo { 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 { +public: + CCreGenLeveledCastleInfo() = default; + void serializeJson(JsonSerializeFormat & handler) override; }; class DLL_LINKAGE CGDwelling : public CArmedInstance @@ -49,9 +65,13 @@ class DLL_LINKAGE CGDwelling : public CArmedInstance public: typedef std::vector > > TCreaturesSet; - CSpecObjInfo * info; //h3m info about dewlling + CSpecObjInfo * info; //random dwelling options; not serialized TCreaturesSet creatures; //creatures[level] -> + CGDwelling(); + virtual ~CGDwelling(); + + void initRandomObjectInfo(); protected: void serializeJsonOptions(JsonSerializeFormat & handler) override; @@ -245,6 +265,8 @@ public: void clearArmy() const; void addHeroToStructureVisitors(const CGHeroInstance *h, si32 structureInstanceID) const; //hero must be visiting or garrisoned in town + const CTown * getTown() const ; + CGTownInstance(); virtual ~CGTownInstance(); diff --git a/lib/mapObjects/CObjectClassesHandler.h b/lib/mapObjects/CObjectClassesHandler.h index 86f589bdc..df5e552ba 100644 --- a/lib/mapObjects/CObjectClassesHandler.h +++ b/lib/mapObjects/CObjectClassesHandler.h @@ -242,6 +242,8 @@ public: /// Returns handler string describing the handler (for use in client) std::string getObjectHandlerName(si32 type) const; + + template void serialize(Handler &h, const int version) { h & objects; diff --git a/lib/mapObjects/CObjectHandler.cpp b/lib/mapObjects/CObjectHandler.cpp index c18099cb8..692326e20 100644 --- a/lib/mapObjects/CObjectHandler.cpp +++ b/lib/mapObjects/CObjectHandler.cpp @@ -328,9 +328,9 @@ void CGObjectInstance::serializeJson(JsonSerializeFormat & handler) handler.serializeString("type", typeName); handler.serializeString("subtype", subTypeName); - handler.serializeNumeric("x", pos.x); - handler.serializeNumeric("y", pos.y); - handler.serializeNumeric("l", pos.z); + handler.serializeInt("x", pos.x); + handler.serializeInt("y", pos.y); + handler.serializeInt("l", pos.z); appearance.writeJson(handler.getCurrent()["template"], false); } @@ -352,32 +352,12 @@ void CGObjectInstance::serializeJsonOptions(JsonSerializeFormat & handler) void CGObjectInstance::serializeJsonOwner(JsonSerializeFormat & handler) { - std::string temp; + ui8 temp = tempOwner.getNum(); - //todo: use enum serialize - 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.serializeEnum("owner", temp, PlayerColor::NEUTRAL.getNum(), GameConstants::PLAYER_COLOR_NAMES); - handler.serializeString("owner", 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; - } - } + if(!handler.saving) + tempOwner = PlayerColor(temp); } CGObjectInstanceBySubIdFinder::CGObjectInstanceBySubIdFinder(CGObjectInstance * obj) : obj(obj) diff --git a/lib/mapObjects/CQuest.cpp b/lib/mapObjects/CQuest.cpp index f6b7e430d..bac0e30bc 100644 --- a/lib/mapObjects/CQuest.cpp +++ b/lib/mapObjects/CQuest.cpp @@ -20,6 +20,12 @@ #include "MiscObjects.h" #include "../IGameCallback.h" #include "../CGameState.h" +#include "../serializer/JsonSerializeFormat.h" +#include "../CModHandler.h" +#include "../GameConstants.h" +#include "../StringConstants.h" +#include "../spells/CSpellHandler.h" + std::map > CGKeys::playerKeyMap; @@ -395,6 +401,86 @@ void CQuest::getCompletionText(MetaString &iwText, std::vector &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 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("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("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(), rewardType(NOTHING), rID(-1), rVal(-1) { @@ -763,6 +849,165 @@ void CGSeerHut::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) finishQuest(hero, answer); } +void CGSeerHut::serializeJsonOptions(JsonSerializeFormat & handler) +{ + static const std::map 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 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) { blockVisit = true; @@ -775,6 +1020,12 @@ void CGQuestGuard::completeQuest(const CGHeroInstance *h) const cb->removeObject(this); } +void CGQuestGuard::serializeJsonOptions(JsonSerializeFormat & handler) +{ + //quest only, do not call base class + quest->serializeJson(handler, "quest"); +} + void CGKeys::reset() { playerKeyMap.clear(); diff --git a/lib/mapObjects/CQuest.h b/lib/mapObjects/CQuest.h index 6a65e6f33..6950904f4 100644 --- a/lib/mapObjects/CQuest.h +++ b/lib/mapObjects/CQuest.h @@ -80,6 +80,8 @@ public: completedOption = 1; } } + + void serializeJson(JsonSerializeFormat & handler, const std::string & fieldName); }; class DLL_LINKAGE IQuestObject @@ -133,6 +135,8 @@ protected: static const int OBJPROP_VISITED = 10; void setPropertyDer(ui8 what, ui32 val) override; + + void serializeJsonOptions(JsonSerializeFormat & handler) override; }; class DLL_LINKAGE CGQuestGuard : public CGSeerHut @@ -146,6 +150,8 @@ public: { h & static_cast(*this); } +protected: + void serializeJsonOptions(JsonSerializeFormat & handler) override; }; class DLL_LINKAGE CGKeys : public CGObjectInstance //Base class for Keymaster and guards diff --git a/lib/mapObjects/CRewardableConstructor.cpp b/lib/mapObjects/CRewardableConstructor.cpp index 1427b4711..0c84a799e 100644 --- a/lib/mapObjects/CRewardableConstructor.cpp +++ b/lib/mapObjects/CRewardableConstructor.cpp @@ -21,7 +21,7 @@ namespace { MetaString loadMessage(const JsonNode & value) { MetaString ret; - if (value.getType() == JsonNode::DATA_FLOAT) + if (value.isNumber()) ret.addTxt(MetaString::ADVOB_TXT, value.Float()); else ret << value.String(); diff --git a/lib/mapObjects/JsonRandom.cpp b/lib/mapObjects/JsonRandom.cpp index 8ccdabf5f..74d24dea8 100644 --- a/lib/mapObjects/JsonRandom.cpp +++ b/lib/mapObjects/JsonRandom.cpp @@ -28,7 +28,7 @@ namespace JsonRandom { if (value.isNull()) return defaultValue; - if (value.getType() == JsonNode::DATA_FLOAT) + if (value.isNumber()) return value.Float(); if (!value["amount"].isNull()) return value["amount"].Float(); diff --git a/lib/mapObjects/MiscObjects.cpp b/lib/mapObjects/MiscObjects.cpp index cbba1c759..50d73c2bc 100644 --- a/lib/mapObjects/MiscObjects.cpp +++ b/lib/mapObjects/MiscObjects.cpp @@ -600,50 +600,30 @@ static const std::vector CHARACTER_JSON = void CGCreature::serializeJsonOptions(JsonSerializeFormat & handler) { - handler.serializeNumericEnum("character", CHARACTER_JSON, (si8)0, character); + handler.serializeEnum("character", character, CHARACTER_JSON); if(handler.saving) { if(hasStackAtSlot(SlotID(0))) { 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 { si32 amount = 0; - handler.serializeNumeric("amount", amount); + handler.serializeInt("amount", amount); auto hlp = new CStackInstance(); hlp->count = amount; //type will be set during initialization 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("neverFlees", neverFlees); handler.serializeString("rewardMessage", message); @@ -793,7 +773,7 @@ void CGMine::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) con void CGMine::serializeJsonOptions(JsonSerializeFormat & handler) { - CCreatureSet::serializeJson(handler, "army"); + CCreatureSet::serializeJson(handler, "army", 7); if(isAbandoned()) { @@ -934,8 +914,8 @@ void CGResource::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) void CGResource::serializeJsonOptions(JsonSerializeFormat & handler) { - CCreatureSet::serializeJson(handler, "guards"); - handler.serializeNumeric("amount", amount); + CCreatureSet::serializeJson(handler, "guards", 7); + handler.serializeInt("amount", amount, 0); handler.serializeString("guardMessage", message); } @@ -1428,15 +1408,14 @@ void CGArtifact::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) void CGArtifact::serializeJsonOptions(JsonSerializeFormat& handler) { handler.serializeString("guardMessage", message); - CCreatureSet::serializeJson(handler, "guards"); + CCreatureSet::serializeJson(handler, "guards" ,7); if(handler.saving && ID == Obj::SPELL_SCROLL) { const std::shared_ptr b = storedArtifact->getBonusLocalFirst(Selector::type(Bonus::SPELL)); SpellID spellId(b->subtype); - std::string spell = SpellID(b->subtype).toSpell()->identifier; - handler.serializeString("spell", spell); + handler.serializeId("spell", spellId, SpellID::NONE, &CSpellHandler::decodeSpell, &CSpellHandler::encodeSpell); } } @@ -1665,7 +1644,7 @@ std::string CGShrine::getHoverText(const CGHeroInstance * hero) const 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) @@ -1861,7 +1840,7 @@ void CGGarrison::serializeJsonOptions(JsonSerializeFormat& handler) { handler.serializeBool("removableUnits", removableUnits); serializeJsonOwner(handler); - CCreatureSet::serializeJson(handler, "army"); + CCreatureSet::serializeJson(handler, "army", 7); } void CGMagi::reset() diff --git a/lib/mapObjects/ObjectTemplate.cpp b/lib/mapObjects/ObjectTemplate.cpp index f2009a463..3b7f4b65c 100644 --- a/lib/mapObjects/ObjectTemplate.cpp +++ b/lib/mapObjects/ObjectTemplate.cpp @@ -64,7 +64,8 @@ ObjectTemplate::ObjectTemplate(const ObjectTemplate& other): id(other.id), subid(other.subid), printPriority(other.printPriority), - animationFile(other.animationFile) + animationFile(other.animationFile), + editorAnimationFile(other.editorAnimationFile) { //default copy constructor is failing with usedTiles this for unknown reason @@ -81,6 +82,7 @@ ObjectTemplate & ObjectTemplate::operator=(const ObjectTemplate & rhs) subid = rhs.subid; printPriority = rhs.printPriority; animationFile = rhs.animationFile; + editorAnimationFile = rhs.editorAnimationFile; usedTiles.clear(); usedTiles.resize(rhs.usedTiles.size()); @@ -89,6 +91,16 @@ ObjectTemplate & ObjectTemplate::operator=(const ObjectTemplate & rhs) return *this; } +void ObjectTemplate::afterLoadFixup() +{ + if(id == Obj::EVENT) + { + setSize(1,1); + usedTiles[0][0] = VISITABLE; + visitDir = 0xFF; + } +} + void ObjectTemplate::readTxt(CLegacyConfigParser & parser) { std::string data = parser.readString(); @@ -207,16 +219,13 @@ void ObjectTemplate::readMap(CBinaryReader & reader) reader.skip(16); readMsk(); - if (id == Obj::EVENT) - { - setSize(1,1); - usedTiles[0][0] = VISITABLE; - } + afterLoadFixup(); } void ObjectTemplate::readJson(const JsonNode &node, const bool withTerrain) { animationFile = node["animation"].String(); + editorAnimationFile = node["editorAnimation"].String(); const JsonVector & visitDirs = node["visitableFrom"].Vector(); if (!visitDirs.empty()) @@ -284,11 +293,14 @@ void ObjectTemplate::readJson(const JsonNode &node, const bool withTerrain) } printPriority = node["zIndex"].Float(); + + afterLoadFixup(); } void ObjectTemplate::writeJson(JsonNode & node, const bool withTerrain) const { node["animation"].String() = animationFile; + node["editorAnimation"].String() = editorAnimationFile; if(visitDir != 0x0 && isVisitable()) { diff --git a/lib/mapObjects/ObjectTemplate.h b/lib/mapObjects/ObjectTemplate.h index b95263f7f..280943ec3 100644 --- a/lib/mapObjects/ObjectTemplate.h +++ b/lib/mapObjects/ObjectTemplate.h @@ -33,6 +33,8 @@ class DLL_LINKAGE ObjectTemplate /// list of terrains on which this object can be placed std::set allowedTerrains; + void afterLoadFixup(); + public: /// H3 ID/subID of this object Obj id; @@ -42,6 +44,9 @@ public: /// animation file that should be used to display object 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 std::string stringID; @@ -86,6 +91,10 @@ public: { h & usedTiles & allowedTerrains & animationFile & stringID; h & id & subid & printPriority & visitDir; + if(version >= 770) + { + h & editorAnimationFile; + } } }; diff --git a/lib/mapping/CMap.cpp b/lib/mapping/CMap.cpp index 002705d8a..2b2f6734f 100644 --- a/lib/mapping/CMap.cpp +++ b/lib/mapping/CMap.cpp @@ -11,6 +11,7 @@ #include "../CGeneralTextHandler.h" #include "../spells/CSpellHandler.h" #include "CMapEditManager.h" +#include "../serializer/JsonSerializeFormat.h" SHeroName::SHeroName() : heroId(-1) { @@ -18,8 +19,8 @@ SHeroName::SHeroName() : heroId(-1) } PlayerInfo::PlayerInfo(): canHumanPlay(false), canComputerPlay(false), - aiTactic(EAiTactic::RANDOM), isFactionRandom(false), mainCustomHeroPortrait(-1), mainCustomHeroId(-1), hasMainTown(false), - generateHeroAtMainTown(false), team(TeamID::NO_TEAM), hasRandomHero(false), /* following are unused */ generateHero(false), p7(0), powerPlaceholders(-1) + aiTactic(EAiTactic::RANDOM), isFactionRandom(false), hasRandomHero(false), mainCustomHeroPortrait(-1), mainCustomHeroId(-1), hasMainTown(false), + generateHeroAtMainTown(false), team(TeamID::NO_TEAM), /* following are unused */ generateHero(false), p7(0), powerPlaceholders(-1) { allowedFactions = VLC->townh->getAllowedFactions(); } @@ -61,6 +62,7 @@ bool PlayerInfo::hasCustomMainHero() const EventCondition::EventCondition(EWinLoseType condition): object(nullptr), + metaType(EMetaclass::INVALID), value(-1), objectType(-1), objectSubtype(-1), @@ -71,6 +73,7 @@ EventCondition::EventCondition(EWinLoseType condition): EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectType, int3 position): object(nullptr), + metaType(EMetaclass::INVALID), value(value), objectType(objectType), objectSubtype(-1), @@ -78,6 +81,12 @@ EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectTy condition(condition) {} +void Rumor::serializeJson(JsonSerializeFormat & handler) +{ + handler.serializeString("name", name); + handler.serializeString("text", text); +} + DisposedHero::DisposedHero() : heroId(0), portrait(255), players(0) { @@ -503,22 +512,26 @@ void CMap::checkForObjectives() { 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()); + 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, "%d", boost::lexical_cast(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, "%d", boost::lexical_cast(cond.value)); + break; - break; case EventCondition::HAVE_BUILDING: + case EventCondition::HAVE_BUILDING: if (isInTheMap(cond.position)) cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN); + break; - break; case EventCondition::CONTROL: + case EventCondition::CONTROL: if (isInTheMap(cond.position)) cond.object = getObjectiveObjectFrom(cond.position, Obj::EObj(cond.objectType)); @@ -531,8 +544,9 @@ void CMap::checkForObjectives() if (hero) boost::algorithm::replace_first(event.onFulfill, "%s", hero->name); } + break; - break; case EventCondition::DESTROY: + case EventCondition::DESTROY: if (isInTheMap(cond.position)) cond.object = getObjectiveObjectFrom(cond.position, Obj::EObj(cond.objectType)); @@ -542,12 +556,22 @@ void CMap::checkForObjectives() if (hero) boost::algorithm::replace_first(event.onFulfill, "%s", hero->name); } - break; case EventCondition::TRANSPORT: + break; + case EventCondition::TRANSPORT: cond.object = getObjectiveObjectFrom(cond.position, Obj::TOWN); + break; //break; case EventCondition::DAYS_PASSED: //break; case EventCondition::IS_HUMAN: //break; case EventCondition::DAYS_WITHOUT_TOWN: //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; }; diff --git a/lib/mapping/CMap.h b/lib/mapping/CMap.h index 8b4097236..cf6624003 100644 --- a/lib/mapping/CMap.h +++ b/lib/mapping/CMap.h @@ -68,16 +68,22 @@ struct DLL_LINKAGE PlayerInfo std::set allowedFactions; 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; - 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 heroesNames; /// list of placed heroes on the map bool hasMainTown; /// The default value is false. bool generateHeroAtMainTown; /// The default value is false. int3 posOfMainTown; TeamID team; /// The default value NO_TEAM - bool hasRandomHero; /// Player has a random hero + bool generateHero; /// Unused. si32 p7; /// Unknown and unused. @@ -91,6 +97,11 @@ struct DLL_LINKAGE PlayerInfo h & p7 & hasRandomHero & mainCustomHeroId & canHumanPlay & canComputerPlay & aiTactic & allowedFactions & isFactionRandom & mainCustomHeroPortrait & mainCustomHeroName & heroesNames & hasMainTown & generateHeroAtMainTown & 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)); const CGObjectInstance * object; // object that was at specified position or with instance name on start + EMetaclass metaType; si32 value; si32 objectType; si32 objectSubtype; @@ -144,6 +156,8 @@ struct DLL_LINKAGE EventCondition h & objectSubtype; h & objectInstanceName; } + if(version >= 770) + h & metaType; } }; @@ -203,11 +217,16 @@ struct DLL_LINKAGE Rumor std::string name; std::string text; + Rumor() = default; + ~Rumor() = default; + template void serialize(Handler & h, const int version) { h & name & text; } + + void serializeJson(JsonSerializeFormat & handler); }; /// The disposed hero struct describes which hero can be hired from which player. diff --git a/lib/mapping/CMapEditManager.cpp b/lib/mapping/CMapEditManager.cpp index 60132feed..bc2456fab 100644 --- a/lib/mapping/CMapEditManager.cpp +++ b/lib/mapping/CMapEditManager.cpp @@ -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(map, obj, pos)); + execute(make_unique(map, obj)); } void CMapEditManager::execute(std::unique_ptr && 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 terrainViewPatternFlips.push_back(terGroupPattern); } - terrainViewPatterns[terGroup].push_back(terrainViewPatternFlips); + terrainViewPatterns[terGroup].push_back(terrainViewPatternFlips); } } else if(i == 1) @@ -1069,15 +1069,14 @@ std::string CClearTerrainOperation::getLabel() const return "Clear Terrain"; } -CInsertObjectOperation::CInsertObjectOperation(CMap * map, CGObjectInstance * obj, const int3 & pos) - : CMapOperation(map), pos(pos), obj(obj) +CInsertObjectOperation::CInsertObjectOperation(CMap * map, CGObjectInstance * obj) + : CMapOperation(map), obj(obj) { } void CInsertObjectOperation::execute() { - obj->pos = pos; obj->id = ObjectInstanceID(map->objects.size()); boost::format fmt("%s_%d"); diff --git a/lib/mapping/CMapEditManager.h b/lib/mapping/CMapEditManager.h index 6234d8a1b..09875cdcc 100644 --- a/lib/mapping/CMapEditManager.h +++ b/lib/mapping/CMapEditManager.h @@ -119,10 +119,10 @@ public: static const int FLIP_PATTERN_VERTICAL = 2; static const int FLIP_PATTERN_BOTH = 3; -protected: +protected: 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; }; @@ -170,11 +170,11 @@ public: /// Draws terrain at the current terrain selection. The selection will be cleared automatically. void drawTerrain(ETerrainType terType, CRandomGenerator * gen = nullptr); - + /// Draws roads at the current terrain selection. The selection will be cleared automatically. void drawRoad(ERoadType::ERoadType roadType, CRandomGenerator * gen = nullptr); - - void insertObject(CGObjectInstance * obj, const int3 & pos); + + void insertObject(CGObjectInstance * obj); CTerrainSelection & getTerrainSelection(); 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. int points; - private: + private: bool standardRule; bool anyRule; bool dirtRule; @@ -421,7 +421,7 @@ private: class CInsertObjectOperation : public CMapOperation { public: - CInsertObjectOperation(CMap * map, CGObjectInstance * obj, const int3 & pos); + CInsertObjectOperation(CMap * map, CGObjectInstance * obj); void execute() override; void undo() override; @@ -429,6 +429,5 @@ public: std::string getLabel() const override; private: - int3 pos; CGObjectInstance * obj; }; diff --git a/lib/mapping/MapFormatH3M.cpp b/lib/mapping/MapFormatH3M.cpp index 75614419b..ee6eef1f7 100644 --- a/lib/mapping/MapFormatH3M.cpp +++ b/lib/mapping/MapFormatH3M.cpp @@ -130,6 +130,7 @@ void CMapLoaderH3M::init() } } map->calculateGuardingGreaturePositions(); + afterRead(); } void CMapLoaderH3M::readHeader() @@ -1322,7 +1323,8 @@ void CMapLoaderH3M::readObjects() case Obj::RANDOM_DWELLING_LVL: //same as castle, fixed level case Obj::RANDOM_DWELLING_FACTION: //level range, fixed faction { - nobj = new CGDwelling(); + auto dwelling = new CGDwelling(); + nobj = dwelling; CSpecObjInfo * spec = nullptr; switch(objTempl.id) { @@ -1330,18 +1332,31 @@ void CMapLoaderH3M::readObjects() break; case Obj::RANDOM_DWELLING_LVL: spec = new CCreGenAsCastleInfo(); 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 if (auto castleSpec = dynamic_cast(spec)) { - castleSpec->identifier = reader.readUInt32(); + castleSpec->instanceId = ""; + castleSpec->identifier = reader.readUInt32(); if(!castleSpec->identifier) { castleSpec->asCastle = false; - castleSpec->castles[0] = reader.readUInt8(); - castleSpec->castles[1] = reader.readUInt8(); + const int MASK_SIZE = 8; + 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 { @@ -1355,8 +1370,7 @@ void CMapLoaderH3M::readObjects() lvlSpec->minLevel = std::max(reader.readUInt8(), ui8(1)); lvlSpec->maxLevel = std::min(reader.readUInt8(), ui8(7)); } - nobj->setOwner(spec->player); - static_cast(nobj)->info = spec; + dwelling->info = spec; break; } case Obj::QUEST_GUARD: @@ -1819,9 +1833,9 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard) switch(guard->quest->missionType) { - case 0: + case CQuest::MISSION_NONE: return; - case 2: + case CQuest::MISSION_PRIMARY_STAT: { guard->quest->m2stats.resize(4); for(int x = 0; x < 4; ++x) @@ -1830,14 +1844,14 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard) } } break; - case 1: - case 3: - case 4: + case CQuest::MISSION_LEVEL: + case CQuest::MISSION_KILL_HERO: + case CQuest::MISSION_KILL_CREATURE: { guard->quest->m13489val = reader.readUInt32(); break; } - case 5: + case CQuest::MISSION_ART: { int artNumber = reader.readUInt8(); for(int yy = 0; yy < artNumber; ++yy) @@ -1848,7 +1862,7 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard) } break; } - case 6: + case CQuest::MISSION_ARMY: { int typeNumber = reader.readUInt8(); guard->quest->m6creatures.resize(typeNumber); @@ -1859,7 +1873,7 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard) } break; } - case 7: + case CQuest::MISSION_RESOURCES: { guard->quest->m7resources.resize(7); for(int x = 0; x < 7; ++x) @@ -1868,8 +1882,8 @@ void CMapLoaderH3M::readQuest(IQuestObject * guard) } break; } - case 8: - case 9: + case CQuest::MISSION_HERO: + case CQuest::MISSION_PLAYER: { guard->quest->m13489val = reader.readUInt8(); break; @@ -2134,7 +2148,6 @@ void CMapLoaderH3M::readMessageAndGuards(std::string& message, CCreatureSet* gua } } - void CMapLoaderH3M::readSpells(std::set& dest) { readBitmask(dest,9,GameConstants::SPELLS_QUANTITY,false); @@ -2149,8 +2162,8 @@ void CMapLoaderH3M::readResourses(TResources& resources) } } -template -void CMapLoaderH3M::readBitmask(std::set& dest, const int byteCount, const int limit, bool negate) +template +void CMapLoaderH3M::readBitmask(std::set& dest, const int byteCount, const int limit, bool negate) { std::vector temp; temp.resize(limit,true); @@ -2160,18 +2173,11 @@ void CMapLoaderH3M::readBitmask(std::set& dest, const int byteCount, { if(temp[i]) { - dest.insert(static_cast(i)); + dest.insert(static_cast(i)); } -// else -// { -// dest.erase(static_cast(i)); -// } } - } - - void CMapLoaderH3M::readBitmask(std::vector& dest, const int byteCount, const int limit, bool negate) { for(int byte = 0; byte < byteCount; ++byte) @@ -2189,7 +2195,6 @@ void CMapLoaderH3M::readBitmask(std::vector& dest, const int byteCount, co } } - ui8 CMapLoaderH3M::reverse(ui8 arg) { ui8 ret = 0; @@ -2202,3 +2207,33 @@ ui8 CMapLoaderH3M::reverse(ui8 arg) } 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(); + } + } +} diff --git a/lib/mapping/MapFormatH3M.h b/lib/mapping/MapFormatH3M.h index de1c8724e..b9e395d0c 100644 --- a/lib/mapping/MapFormatH3M.h +++ b/lib/mapping/MapFormatH3M.h @@ -242,6 +242,8 @@ private: return p; } + void afterRead(); + /** List of templates loaded from the map, used on later stage to create * objects but not needed for fully functional CMap */ std::vector templates; diff --git a/lib/mapping/MapFormatJson.cpp b/lib/mapping/MapFormatJson.cpp index 4df1ddd54..025be85eb 100644 --- a/lib/mapping/MapFormatJson.cpp +++ b/lib/mapping/MapFormatJson.cpp @@ -15,6 +15,7 @@ #include "../filesystem/COutputStream.h" #include "CMap.h" #include "../CModHandler.h" +#include "../CCreatureHandler.h" #include "../CHeroHandler.h" #include "../CTownHandler.h" #include "../VCMI_Lib.h" @@ -28,6 +29,65 @@ #include "../serializer/JsonDeserializer.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 { static const ui8 difficultyDefault = 1;//normal @@ -40,6 +100,12 @@ namespace HeaderDetail "EXPERT", "IMPOSSIBLE" }; + + static const std::vector canPlayMap = + { + "AIOnly", + "PlayerOrAI" + }; } namespace TriggeredEventsDetail @@ -53,12 +119,67 @@ namespace TriggeredEventsDetail "have_0", "haveBuilding_0", "destroy_0" }; - static const std::array 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 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) { - //todo: support of new condition format EventCondition event; const auto & conditionName = node.Vector()[0].String(); @@ -66,24 +187,58 @@ namespace TriggeredEventsDetail auto pos = vstd::find_pos(conditionNames, conditionName); event.condition = EventCondition::EWinLoseType(pos); + if (node.Vector().size() > 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"]); - if(identifier) - event.objectType = identifier.get(); - else - throw std::runtime_error("Identifier resolution failed in event condition"); + case EventCondition::HAVE_0: + case EventCondition::DESTROY_0: + { + //todo: support subtypes + + 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()) { auto & position = data["position"].Vector(); @@ -91,21 +246,15 @@ namespace TriggeredEventsDetail event.position.y = position.at(1).Float(); event.position.z = position.at(2).Float(); } - -// if(!data["subtype"].isNull()) -// { -// //todo -// } -// event.objectInstanceName = data["object"].String(); } return event; } - static JsonNode ConditionToJson(const EventCondition& event) + static JsonNode ConditionToJson(const EventCondition & event) { JsonNode json; - JsonVector& asVector = json.Vector(); + JsonVector & asVector = json.Vector(); JsonNode condition; condition.String() = conditionNames.at(event.condition); @@ -113,15 +262,41 @@ namespace TriggeredEventsDetail JsonNode data; - //todo: save identifier + switch (event.condition) + { + case EventCondition::HAVE_0: + case EventCondition::DESTROY_0: + { + //todo: support subtypes - if(event.objectType != -1) - data["type"].Float() = event.objectType; + if(event.metaType != EMetaclass::INVALID) + data["type"].String() = encodeIdentifier(event.metaType, event.objectType); - if(event.value != -1) - data["value"].Float() = event.value; + if(event.value > 0) + 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(); position.resize(3); @@ -153,7 +328,7 @@ namespace TerrainDetail "", "rw", "ri", "rm", "rl" }; - static const std::array flipCodes = + static const std::array flipCodes = { '_', '-', '|', '+' }; @@ -166,6 +341,12 @@ const int CMapFormatJson::VERSION_MINOR = 0; const std::string CMapFormatJson::HEADER_FILE_NAME = "header.json"; const std::string CMapFormatJson::OBJECTS_FILE_NAME = "objects.json"; +CMapFormatJson::CMapFormatJson(): + mapObjectResolver(make_unique(this)) +{ + +} + void CMapFormatJson::serializeAllowedFactions(JsonSerializeFormat & handler, std::set & value) { //TODO: unify allowed factions with others - make them std::vector @@ -196,14 +377,20 @@ void CMapFormatJson::serializeHeader(JsonSerializeFormat & handler) { handler.serializeString("name", mapHeader->name); handler.serializeString("description", mapHeader->description); - handler.serializeNumeric("heroLevelLimit", mapHeader->levelLimit); + handler.serializeInt("heroLevelLimit", mapHeader->levelLimit, 0); //todo: support arbitrary percentage - handler.serializeNumericEnum("difficulty", HeaderDetail::difficultyMap, HeaderDetail::difficultyDefault, mapHeader->difficulty); + handler.serializeEnum("difficulty", mapHeader->difficulty, HeaderDetail::difficultyMap); serializePlayerInfo(handler); 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) @@ -235,48 +422,100 @@ void CMapFormatJson::serializePlayerInfo(JsonSerializeFormat & handler) 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 if(!handler.saving || info.posOfMainTown.valid()) { auto mainTown = handler.enterStruct("mainTown"); handler.serializeBool("generateHero", info.generateHeroAtMainTown); - handler.serializeNumeric("x", info.posOfMainTown.x); - handler.serializeNumeric("y", info.posOfMainTown.y); - handler.serializeNumeric("l", info.posOfMainTown.z); + handler.serializeInt("x", info.posOfMainTown.x, -1); + handler.serializeInt("y", info.posOfMainTown.y, -1); + handler.serializeInt("l", info.posOfMainTown.z, -1); } if(!handler.saving) { info.hasMainTown = info.posOfMainTown.valid(); } - //mainHero - - //mainHeroPortrait - - //mainCustomHeroName + handler.serializeString("mainHero", info.mainHeroInstance);//must be before "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(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) - { - //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; - } + handler.serializeBool("randomFaction", info.isFactionRandom); } } void CMapFormatJson::readTeams(JsonDeserializer & handler) { - auto teams = handler.enterStruct("teams"); + auto teams = handler.enterArray("teams"); const JsonNode & src = teams.get(); if(src.getType() != JsonNode::DATA_VECTOR) @@ -287,12 +526,8 @@ void CMapFormatJson::readTeams(JsonDeserializer & handler) mapHeader->howManyTeams = 0; for(int i = 0; i < PlayerColor::PLAYER_LIMIT_I; i++) - { if(mapHeader->players[i].canComputerPlay || mapHeader->players[i].canHumanPlay) - { mapHeader->players[i].team = TeamID(mapHeader->howManyTeams++); - } - } } else { @@ -300,34 +535,22 @@ void CMapFormatJson::readTeams(JsonDeserializer & handler) mapHeader->howManyTeams = srcVector.size(); for(int team = 0; team < mapHeader->howManyTeams; team++) - { for(const JsonNode & playerData : srcVector[team].Vector()) { PlayerColor player = PlayerColor(vstd::find_pos(GameConstants::PLAYER_COLOR_NAMES, playerData.String())); if(player.isValidPlayer()) - { if(mapHeader->players[player.getNum()].canAnyonePlay()) - { mapHeader->players[player.getNum()].team = TeamID(team); - } - } } - } for(PlayerInfo & player : mapHeader->players) - { if(player.canAnyonePlay() && player.team == TeamID::NO_TEAM) player.team = TeamID(mapHeader->howManyTeams++); - } - } } - void CMapFormatJson::writeTeams(JsonSerializer & handler) { - auto teams = handler.enterStruct("teams"); - JsonNode & dest = teams.get(); std::vector> teamsData; teamsData.resize(mapHeader->howManyTeams); @@ -347,41 +570,35 @@ void CMapFormatJson::writeTeams(JsonSerializer & handler) return elem.size() <= 1; }); - //construct output - dest.setType(JsonNode::DATA_VECTOR); - - for(const std::set & teamData : teamsData) + if(!teamsData.empty()) { - JsonNode team(JsonNode::DATA_VECTOR); - for(const PlayerColor & player : teamData) + auto teams = handler.enterArray("teams"); + JsonNode & dest = teams.get(); + + //construct output + dest.setType(JsonNode::DATA_VECTOR); + + for(const std::set & teamData : teamsData) { - JsonNode member(JsonNode::DATA_STRING); - member.String() = GameConstants::PLAYER_COLOR_NAMES[player.getNum()]; - team.Vector().push_back(std::move(member)); + JsonNode team(JsonNode::DATA_VECTOR); + for(const PlayerColor & player : teamData) + { + 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) { const JsonNode & input = handler.getCurrent(); - serializeTriggeredEvents(handler); - mapHeader->triggeredEvents.clear(); - for (auto & entry : input["triggeredEvents"].Struct()) + for(auto & entry : input["triggeredEvents"].Struct()) { TriggeredEvent event; event.identifier = entry.first; @@ -405,34 +622,138 @@ void CMapFormatJson::writeTriggeredEvents(JsonSerializer & handler) { JsonNode & output = handler.getCurrent(); - serializeTriggeredEvents(handler); - JsonMap & triggeredEvents = output["triggeredEvents"].Struct(); for(auto event : mapHeader->triggeredEvents) writeTriggeredEvent(event, triggeredEvents[event.identifier]); } -void CMapFormatJson::writeTriggeredEvent(const TriggeredEvent& event, JsonNode& dest) +void CMapFormatJson::writeTriggeredEvent(const TriggeredEvent & event, JsonNode & dest) { using namespace TriggeredEventsDetail; - dest["message"].String() = event.onFulfill; - dest["description"].String() = event.description; + if(!event.onFulfill.empty()) + 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"]["messageToSend"].String() = event.effect.toOtherMessage; + + if(!event.effect.toOtherMessage.empty()) + dest["effect"]["messageToSend"].String() = event.effect.toOtherMessage; 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) { - //rumors + serializeRumors(handler); - //disposedHeroes - - //predefinedHeroes + serializePredefinedHeroes(handler); 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); - //events + //todo:events } void CMapFormatJson::readOptions(JsonDeserializer & handler) { + readDisposedHeroes(handler); serializeOptions(handler); } void CMapFormatJson::writeOptions(JsonSerializer & handler) { + writeDisposedHeroes(handler); serializeOptions(handler); } - ///CMapPatcher CMapPatcher::CMapPatcher(JsonNode stream): + CMapFormatJson(), input(stream) { //todo: update map patches and change this @@ -473,13 +796,13 @@ void CMapPatcher::patchMapHeader(std::unique_ptr & header) void CMapPatcher::readPatchData() { - JsonDeserializer handler(input); + JsonDeserializer handler(mapObjectResolver.get(), input); readTriggeredEvents(handler); } - ///CMapLoaderJson CMapLoaderJson::CMapLoaderJson(CInputStream * stream): + CMapFormatJson(), buffer(stream), ioApi(new CProxyROIOApi(buffer)), loader("", "_", ioApi) @@ -487,17 +810,6 @@ CMapLoaderJson::CMapLoaderJson(CInputStream * stream): } -si32 CMapLoaderJson::getIdentifier(const std::string& type, const std::string& name) -{ - boost::optional 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 CMapLoaderJson::loadMap() { LOG_TRACE(logGlobal); @@ -560,10 +872,10 @@ void CMapLoaderJson::readHeader(const bool complete) 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 @@ -586,20 +898,18 @@ void CMapLoaderJson::readHeader(const bool complete) readTriggeredEvents(handler); - readTeams(handler); - //TODO: readHeader + //TODO: check mods if(complete) readOptions(handler); } - -void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile) +void CMapLoaderJson::readTerrainTile(const std::string & src, TerrainTile & tile) { using namespace TerrainDetail; {//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); @@ -616,7 +926,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile) int len = pos - startPos; if(len<=0) 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()); startPos+=len; } @@ -631,7 +941,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile) return; bool hasRoad = true; {//road type - const std::string typeCode = src.substr(startPos,2); + const std::string typeCode = src.substr(startPos, 2); startPos+=2; int rawType = vstd::find_pos(roadCodes, typeCode); if(rawType < 0) @@ -656,7 +966,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile) int len = pos - startPos; if(len<=0) 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()); startPos+=len; } @@ -672,7 +982,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile) return; if(hasRoad) {//river type - const std::string typeCode = src.substr(startPos,2); + const std::string typeCode = src.substr(startPos, 2); startPos+=2; int rawType = vstd::find_pos(riverCodes, typeCode); if(rawType < 0) @@ -686,7 +996,7 @@ void CMapLoaderJson::readTerrainTile(const std::string& src, TerrainTile& tile) int len = pos - startPos; if(len<=0) 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()); 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(); @@ -734,15 +1044,15 @@ void CMapLoaderJson::readTerrain() } -CMapLoaderJson::MapObjectLoader::MapObjectLoader(CMapLoaderJson * _owner, JsonMap::value_type& json): - owner(_owner), instance(nullptr),id(-1), jsonKey(json.first), configuration(json.second) +CMapLoaderJson::MapObjectLoader::MapObjectLoader(CMapLoaderJson * _owner, JsonMap::value_type & json): + owner(_owner), instance(nullptr), id(-1), jsonKey(json.first), configuration(json.second) { } void CMapLoaderJson::MapObjectLoader::construct() { - logGlobal->debugStream() <<"Loading: " <debugStream() <<"Loading: " <type); appearance.subid = handler->subtype; + appearance.readJson(configuration["template"], false); instance = handler->create(appearance); @@ -795,14 +1105,15 @@ void CMapLoaderJson::MapObjectLoader::configure() if(nullptr == instance) return; - JsonDeserializer handler(configuration); + JsonDeserializer handler(owner->mapObjectResolver.get(), configuration); 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(instance)) { - //todo: find better place for this code - int artID = ArtifactID::NONE; int spellID = -1; @@ -824,6 +1135,12 @@ void CMapLoaderJson::MapObjectLoader::configure() art->storedArtifact = CArtifactInstance::createArtifact(owner->map, artID, spellID); } + + if(auto hero = dynamic_cast(instance)) + { + auto o = handler.enterStruct("options"); + hero->serializeJsonArtifacts(handler, "artifacts", owner->map); + } } void CMapLoaderJson::readObjects() @@ -853,6 +1170,7 @@ void CMapLoaderJson::readObjects() ///CMapSaverJson CMapSaverJson::CMapSaverJson(CInputOutputStream * stream): + CMapFormatJson(), buffer(stream), ioApi(new CProxyIOApi(buffer)), 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; out << data; @@ -893,7 +1211,7 @@ void CMapSaverJson::saveMap(const std::unique_ptr& map) void CMapSaverJson::writeHeader() { JsonNode header; - JsonSerializer handler(header); + JsonSerializer handler(mapObjectResolver.get(), header); header["versionMajor"].Float() = VERSION_MAJOR; 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]; if(tile.roadType != ERoadType::NO_ROAD) - { out << roadCodes.at(int(tile.roadType)) << (int)tile.roadDir << flipCodes[(tile.extTileFlags >> 4) % 4]; - } if(tile.riverType != ERiverType::NO_RIVER) - { out << riverCodes.at(int(tile.riverType)) << (int)tile.riverDir << flipCodes[(tile.extTileFlags >> 2) % 4]; - } return out.str(); } @@ -983,7 +1297,7 @@ void CMapSaverJson::writeObjects() { JsonNode data(JsonNode::DATA_STRUCT); - JsonSerializer handler(data); + JsonSerializer handler(mapObjectResolver.get(), data); for(CGObjectInstance * obj : map->objects) { diff --git a/lib/mapping/MapFormatJson.h b/lib/mapping/MapFormatJson.h index df87e4fc5..7ed307cb3 100644 --- a/lib/mapping/MapFormatJson.h +++ b/lib/mapping/MapFormatJson.h @@ -17,6 +17,8 @@ #include "../filesystem/CZipLoader.h" #include "../GameConstants.h" +#include "../serializer/JsonSerializeFormat.h" + struct TriggeredEvent; struct TerrainTile; struct PlayerInfo; @@ -39,6 +41,8 @@ public: int fileVersionMajor; int fileVersionMinor; protected: + friend class MapObjectResolver; + std::unique_ptr mapObjectResolver; /** ptr to the map object which gets filled by data from the buffer or written to buffer */ CMap * map; @@ -49,6 +53,8 @@ protected: */ CMapHeader * mapHeader; + CMapFormatJson(); + void serializeAllowedFactions(JsonSerializeFormat & handler, std::set & value); ///common part of header saving/loading @@ -67,10 +73,6 @@ protected: */ void writeTeams(JsonSerializer & handler); - - ///common part triggered events of saving/loading - void serializeTriggeredEvents(JsonSerializeFormat & handler); - /** * Reads triggered events, including victory/loss conditions */ @@ -91,7 +93,13 @@ protected: */ 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 void serializeOptions(JsonSerializeFormat & handler); @@ -130,7 +138,6 @@ private: */ void readPatchData(); - JsonNode input; }; @@ -174,11 +181,8 @@ private: ///configures object void configure(); - }; - si32 getIdentifier(const std::string & type, const std::string & name); - /** * Reads the map header. */ diff --git a/lib/rmg/CRmgTemplateZone.cpp b/lib/rmg/CRmgTemplateZone.cpp index 46332fc04..cbd3ed652 100644 --- a/lib/rmg/CRmgTemplateZone.cpp +++ b/lib/rmg/CRmgTemplateZone.cpp @@ -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 std::map cameFrom; // The map of navigated nodes. std::map 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 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.insert(townType); playerInfo.hasMainTown = true; - playerInfo.posOfMainTown = town->pos - town->getVisitableOffset(); + playerInfo.posOfMainTown = town->pos; playerInfo.generateHeroAtMainTown = true; //now create actual towns @@ -2092,7 +2092,7 @@ void CRmgTemplateZone::checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance* 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(); } diff --git a/lib/serializer/CSerializer.h b/lib/serializer/CSerializer.h index 14bf457d4..b6090d147 100644 --- a/lib/serializer/CSerializer.h +++ b/lib/serializer/CSerializer.h @@ -14,7 +14,7 @@ #include "../ConstTransitivePtr.h" #include "../GameConstants.h" -const ui32 SERIALIZATION_VERSION = 762; +const ui32 SERIALIZATION_VERSION = 770; const ui32 MINIMAL_SERIALIZATION_VERSION = 753; const std::string SAVEGAME_MAGIC = "VCMISVG"; diff --git a/lib/serializer/JsonDeserializer.cpp b/lib/serializer/JsonDeserializer.cpp index f6229ded0..43a6d097c 100644 --- a/lib/serializer/JsonDeserializer.cpp +++ b/lib/serializer/JsonDeserializer.cpp @@ -14,63 +14,88 @@ #include "../JsonNode.h" -JsonDeserializer::JsonDeserializer(JsonNode & root_): - JsonSerializeFormat(root_, false) +JsonDeserializer::JsonDeserializer(const IInstanceResolver * instanceResolver_, JsonNode & root_): + 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(); -} - -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 & 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; + const JsonNode & data = current->operator[](fieldName); + if(data.getType() != JsonNode::DATA_BOOL) + value = boost::logic::indeterminate; 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 & defaultValue, const TDecoder & decoder, const TEncoder & encoder) { std::string identifier; serializeString(fieldName, identifier); - if(identifier == "") - { - value = defaultValue; - return; - } + value = defaultValue ? defaultValue.get() : 0; - si32 rawId = decoder(identifier); - if(rawId >= 0) - value = rawId; + if(identifier != "") + { + si32 rawId = decoder(identifier); + if(rawId >= 0) + value = rawId; + } +} + +void JsonDeserializer::serializeInternal(const std::string & fieldName, std::vector & 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 & defaultValue) +{ + const JsonNode & data = current->operator[](fieldName); + + if(!data.isNumber()) + value = defaultValue ? defaultValue.get() : 0;//todo: report error on not null? else - value = defaultValue; + value = data.Float(); +} + +void JsonDeserializer::serializeInternal(const std::string & fieldName, si64 & value, const boost::optional & 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 & defaultValue, const std::vector & 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 & standard, std::vector & value) { const JsonNode & field = current->operator[](fieldName); - if(field.isNull()) - return; const JsonNode & anyOf = field["anyOf"]; 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) { 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 & 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); + } +} + diff --git a/lib/serializer/JsonDeserializer.h b/lib/serializer/JsonDeserializer.h index cfd7031a5..83fbf652c 100644 --- a/lib/serializer/JsonDeserializer.h +++ b/lib/serializer/JsonDeserializer.h @@ -17,18 +17,22 @@ class JsonNode; class JsonDeserializer: public JsonSerializeFormat { 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 & standard, std::vector & 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; protected: - void serializeFloat(const std::string & fieldName, double & value) override; - void serializeIntEnum(const std::string & fieldName, const std::vector & enumMap, const si32 defaultValue, si32 & value) 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, boost::logic::tribool & value) override; + void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const TDecoder & decoder, const TEncoder & encoder) override; + void serializeInternal(const std::string & fieldName, std::vector & value, const TDecoder & decoder, const TEncoder & encoder) override; + void serializeInternal(const std::string & fieldName, double & value, const boost::optional & defaultValue) override; + void serializeInternal(const std::string & fieldName, si64 & value, const boost::optional & defaultValue) override; + void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const std::vector & enumMap) override; + private: void readLICPart(const JsonNode & part, const TDecoder & decoder, const bool val, std::vector & value); + void readLICPart(const JsonNode & part, const TDecoder & decoder, std::set & value); }; diff --git a/lib/serializer/JsonSerializeFormat.cpp b/lib/serializer/JsonSerializeFormat.cpp index d11cff326..9240ae2b5 100644 --- a/lib/serializer/JsonSerializeFormat.cpp +++ b/lib/serializer/JsonSerializeFormat.cpp @@ -14,57 +14,147 @@ #include "../JsonNode.h" - -//JsonStructSerializer -JsonStructSerializer::JsonStructSerializer(JsonStructSerializer&& other): - restoreState(false), +//JsonSerializeHelper +JsonSerializeHelper::JsonSerializeHelper(JsonSerializeHelper && other): owner(other.owner), + thisNode(other.thisNode), parentNode(other.parentNode), - thisNode(other.thisNode) + restoreState(false) { - + std::swap(restoreState, other.restoreState); } -JsonStructSerializer::~JsonStructSerializer() +JsonSerializeHelper::~JsonSerializeHelper() { if(restoreState) owner.current = parentNode; } -JsonStructSerializer::JsonStructSerializer(JsonSerializeFormat& owner_, const std::string& fieldName): - restoreState(true), - owner(owner_), - parentNode(owner.current), - thisNode(&(parentNode->operator[](fieldName))) +JsonNode & JsonSerializeHelper::get() { - owner.current = thisNode; + return * thisNode; } -JsonStructSerializer::JsonStructSerializer(JsonStructSerializer & parent, const std::string & fieldName): - 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->() +JsonSerializeFormat * JsonSerializeHelper::operator->() { return &owner; } -JsonSerializeFormat::LIC::LIC(const std::vector & 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(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(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 & Standard, const TDecoder Decoder, const TEncoder Encoder): standard(Standard), decoder(Decoder), encoder(Encoder) { any.resize(standard.size(), false); @@ -72,19 +162,33 @@ JsonSerializeFormat::LIC::LIC(const std::vector & Standard, const TDecoder none.resize(standard.size(), false); } +JsonSerializeFormat::LICSet::LICSet(const std::set& Standard, const TDecoder Decoder, const TEncoder Encoder): + standard(Standard), decoder(Decoder), encoder(Encoder) +{ + +} //JsonSerializeFormat -JsonSerializeFormat::JsonSerializeFormat(JsonNode & root_, const bool saving_): +JsonSerializeFormat::JsonSerializeFormat(const IInstanceResolver * instanceResolver_, JsonNode & root_, const bool saving_): saving(saving_), root(&root_), - current(root) + current(root), + instanceResolver(instanceResolver_) { } JsonStructSerializer JsonSerializeFormat::enterStruct(const std::string & fieldName) { - JsonStructSerializer res(*this, fieldName); - - return res; + return JsonStructSerializer(*this, fieldName); +} + +JsonArraySerializer JsonSerializeFormat::enterArray(const std::string & fieldName) +{ + return JsonArraySerializer(*this, fieldName); +} + +void JsonSerializeFormat::serializeBool(const std::string & fieldName, bool & value) +{ + serializeBool(fieldName, value, true, false, false); } diff --git a/lib/serializer/JsonSerializeFormat.h b/lib/serializer/JsonSerializeFormat.h index 70ab8abcb..60032b0b2 100644 --- a/lib/serializer/JsonSerializeFormat.h +++ b/lib/serializer/JsonSerializeFormat.h @@ -10,30 +10,96 @@ #pragma once -class JsonNode; +#include "../JsonNode.h" class JsonSerializeFormat; +class JsonStructSerializer; +class JsonArraySerializer; -class JsonStructSerializer: public boost::noncopyable +class IInstanceResolver { public: - JsonStructSerializer(JsonStructSerializer && other); - virtual ~JsonStructSerializer(); + virtual ~IInstanceResolver(){}; + 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(); 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; - JsonNode * parentNode; + 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 JsonSerializeHelper; + friend class JsonArraySerializer; +}; + +class JsonArraySerializer: public JsonSerializeHelper +{ +public: + JsonArraySerializer(JsonStructSerializer && other); + + JsonStructSerializer enterStruct(const size_t index); + + template + void syncSize(Container & c, JsonNode::JsonType type = JsonNode::DATA_NULL); + + ///vector of serializable <-> Json vector of structs + template + void serializeStruct(std::vector & 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 @@ -47,16 +113,28 @@ public: ///may assume that object index is valid typedef std::function TEncoder; + typedef std::function TSerialize; + struct LIC { - LIC(const std::vector & Standard, const TDecoder & Decoder, const TEncoder & Encoder); + LIC(const std::vector & Standard, const TDecoder Decoder, const TEncoder Encoder); const std::vector & standard; - const TDecoder & decoder; - const TEncoder & encoder; + const TDecoder decoder; + const TEncoder encoder; std::vector all, any, none; }; + struct LICSet + { + LICSet(const std::set & Standard, const TDecoder Decoder, const TEncoder Encoder); + + const std::set & standard; + const TDecoder decoder; + const TEncoder encoder; + std::set all, any, none; + }; + const bool saving; JsonSerializeFormat() = delete; @@ -73,19 +151,39 @@ public: }; JsonStructSerializer enterStruct(const std::string & fieldName); + JsonArraySerializer enterArray(const std::string & fieldName); + ///Anything comparable <-> Json bool template - 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); - serializeBool(fieldName, temp); + boost::logic::tribool temp(boost::logic::indeterminate); + + if(value == defaultValue) + ;//leave as indeterminate + else if(value == trueValue) + temp = true; + else if(value == falseValue) + temp = false; + + serializeInternal(fieldName, temp); 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) * @@ -101,48 +199,225 @@ public: */ virtual void serializeLIC(const std::string & fieldName, LIC & value) = 0; - template - void serializeNumericEnum(const std::string & fieldName, const std::vector & enumMap, const T defaultValue, T & value) - { - si32 temp = value; - serializeIntEnum(fieldName, enumMap, defaultValue, temp); - if(!saving) - value = temp; - }; - - template - void serializeNumeric(const std::string & fieldName, T & value) - { - double temp = value; - serializeFloat(fieldName, temp); - if(!saving) - value = temp; - }; + /** @brief Complete serialization of Logical identifier condition. (Special version) + * Assumes that all values are allowed by default, and standard contains them + */ + virtual void serializeLIC(const std::string & fieldName, LICSet & value) = 0; + ///String <-> Json string virtual void serializeString(const std::string & fieldName, std::string & value) = 0; + ///si32-convertible enum <-> Json string enum template - 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 & enumMap) { - const si32 tempDefault = defaultValue.num; - si32 tempValue = value.num; - serializeIntId(fieldName, decoder, encoder, tempDefault, tempValue); + doSerializeInternal(fieldName, value, boost::none, enumMap); + }; + + ///si32-convertible enum <-> Json string enum + template + void serializeEnum(const std::string & fieldName, T & value, const U & defaultValue, const std::vector & enumMap) + { + doSerializeInternal(fieldName, value, defaultValue, enumMap); + }; + + template + void serializeEnum(const std::string & fieldName, T & value, const U & defaultValue, const C & enumMap) + { + std::vector enumMapCopy; + + std::copy(std::begin(enumMap), std::end(enumMap), std::back_inserter(enumMapCopy)); + + doSerializeInternal(fieldName, value, defaultValue, enumMapCopy); + }; + + ///Anything double-convertible <-> Json double + template + void serializeFloat(const std::string & fieldName, T & value) + { + doSerializeInternal(fieldName, value, boost::none); + }; + + ///Anything double-convertible <-> Json double + template + void serializeFloat(const std::string & fieldName, T & value, const U & defaultValue) + { + doSerializeInternal(fieldName, value, defaultValue); + }; + + ///Anything int64-convertible <-> Json integer + template + void serializeInt(const std::string & fieldName, T & value) + { + doSerializeInternal(fieldName, value, boost::none); + }; + + ///Anything int64-convertible <-> Json integer + template + void serializeInt(const std::string & fieldName, T & value, const U & defaultValue) + { + doSerializeInternal(fieldName, value, defaultValue); + }; + + ///si32-convertible identifier <-> Json string + template + void serializeId(const std::string & fieldName, T & value, const U & defaultValue, const TDecoder & decoder, const TEncoder & encoder) + { + doSerializeInternal(fieldName, value, defaultValue, decoder, encoder); + } + + ///si32-convertible identifier vector <-> Json array of string + template + void serializeIdArray(const std::string & fieldName, std::vector & value, const TDecoder & decoder, const TEncoder & encoder) + { + std::vector temp; + + if(saving) + { + temp.reserve(value.size()); + + for(const T & vitem : value) + { + si32 item = static_cast(vitem); + temp.push_back(item); + } + } + + serializeInternal(fieldName, temp, decoder, encoder); if(!saving) - value = T(tempValue); + { + value.clear(); + value.reserve(temp.size()); + + for(const si32 item : temp) + { + T vitem = static_cast(item); + value.push_back(vitem); + } + } + } + + ///si32-convertible identifier set <-> Json array of string + template + void serializeIdArray(const std::string & fieldName, std::set & value, const TDecoder & decoder, const TEncoder & encoder) + { + std::vector temp; + + if(saving) + { + temp.reserve(value.size()); + + for(const T & vitem : value) + { + si32 item = static_cast(vitem); + temp.push_back(item); + } + } + + serializeInternal(fieldName, temp, decoder, encoder); + if(!saving) + { + value.clear(); + + for(const si32 item : temp) + { + T vitem = static_cast(item); + value.insert(vitem); + } + } + } + + ///bitmask <-> Json array of string + template + 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 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 + 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(fieldName, value, defaultValue, decoder, endoder); } protected: JsonNode * root; 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 & enumMap, const si32 defaultValue, si32 & value) = 0; + ///Numeric Id <-> String Id + virtual void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const TDecoder & decoder, const TEncoder & encoder) = 0; + + ///Numeric Id vector <-> String Id vector + virtual void serializeInternal(const std::string & fieldName, std::vector & value, const TDecoder & decoder, const TEncoder & encoder) = 0; + + ///Numeric <-> Json double + virtual void serializeInternal(const std::string & fieldName, double & value, const boost::optional & defaultValue) = 0; + + ///Numeric <-> Json integer + virtual void serializeInternal(const std::string & fieldName, si64 & value, const boost::optional & defaultValue) = 0; + + ///Enum/Numeric <-> Json string enum + virtual void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const std::vector & enumMap) = 0; - virtual void serializeIntId(const std::string & fieldName, const TDecoder & decoder, const TEncoder & encoder, const si32 defaultValue, si32 & value) = 0; private: + const IInstanceResolver * instanceResolver; + + template + void doSerializeInternal(const std::string & fieldName, VType & value, const boost::optional & defaultValue, Args ... args) + { + const boost::optional tempDefault = defaultValue ? boost::optional(static_cast(defaultValue.get())) : boost::none; + IType temp = static_cast(value); + + serializeInternal(fieldName, temp, tempDefault, args...); + + if(!saving) + value = static_cast(temp); + } + + friend class JsonSerializeHelper; friend class JsonStructSerializer; + friend class JsonArraySerializer; }; +template +void JsonArraySerializer::syncSize(Container & c, JsonNode::JsonType type) +{ + if(owner.saving) + resize(c.size(), type); + else + c.resize(size()); +} diff --git a/lib/serializer/JsonSerializer.cpp b/lib/serializer/JsonSerializer.cpp index 22f4215e2..302aa84d2 100644 --- a/lib/serializer/JsonSerializer.cpp +++ b/lib/serializer/JsonSerializer.cpp @@ -14,44 +14,61 @@ #include "../JsonNode.h" -JsonSerializer::JsonSerializer(JsonNode & root_): - JsonSerializeFormat(root_, true) +JsonSerializer::JsonSerializer(const IInstanceResolver * instanceResolver_, JsonNode & root_): + 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) - current->operator[](fieldName).Bool() = true; + if(!boost::logic::indeterminate(value)) + 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 & defaultValue, const TDecoder & decoder, const TEncoder & encoder) { - current->operator[](fieldName).String() = value ? trueValue : falseValue; -} - -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 & 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) + if(!defaultValue || defaultValue.get() != value) { std::string identifier = encoder(value); serializeString(fieldName, identifier); } } +void JsonSerializer::serializeInternal(const std::string & fieldName, double & value, const boost::optional & defaultValue) +{ + if(!defaultValue || defaultValue.get() != value) + current->operator[](fieldName).Float() = value; +} + +void JsonSerializer::serializeInternal(const std::string & fieldName, si64 & value, const boost::optional & defaultValue) +{ + if(!defaultValue || defaultValue.get() != value) + current->operator[](fieldName).Integer() = value; +} + +void JsonSerializer::serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const std::vector & enumMap) +{ + if(!defaultValue || defaultValue.get() != value) + current->operator[](fieldName).String() = enumMap.at(value); +} + +void JsonSerializer::serializeInternal(const std::string & fieldName, std::vector & 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 & standard, std::vector & value) { 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) { if(value.any != value.standard) - { 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, "noneOf", value.encoder, value.none); @@ -78,15 +102,41 @@ void JsonSerializer::serializeString(const std::string & fieldName, std::string current->operator[](fieldName).String() = value; } -void JsonSerializer::writeLICPart(const std::string& fieldName, const std::string& partName, const TEncoder& encoder, const std::vector & data) +void JsonSerializer::writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::vector & data) { - auto & target = current->operator[](fieldName)[partName].Vector(); - for(si32 idx = 0; idx < data.size(); idx ++) - { + std::vector buf; + buf.reserve(data.size()); + + for(si32 idx = 0; idx < data.size(); 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 & data) +{ + std::vector 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 & 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); - val.String() = encoder(idx); + std::swap(val.String(), s); target.push_back(std::move(val)); } } diff --git a/lib/serializer/JsonSerializer.h b/lib/serializer/JsonSerializer.h index 1fae5fb67..4a7c51c19 100644 --- a/lib/serializer/JsonSerializer.h +++ b/lib/serializer/JsonSerializer.h @@ -17,19 +17,23 @@ class JsonNode; class JsonSerializer: public JsonSerializeFormat { 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 & standard, std::vector & 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; protected: - void serializeFloat(const std::string & fieldName, double & value) override; - void serializeIntEnum(const std::string & fieldName, const std::vector & enumMap, const si32 defaultValue, si32 & value) 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, boost::logic::tribool & value) override; + void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const TDecoder & decoder, const TEncoder & encoder) override; + void serializeInternal(const std::string & fieldName, std::vector & value, const TDecoder & decoder, const TEncoder & encoder) override; + void serializeInternal(const std::string & fieldName, double & value, const boost::optional & defaultValue) override; + void serializeInternal(const std::string & fieldName, si64 & value, const boost::optional & defaultValue) override; + void serializeInternal(const std::string & fieldName, si32 & value, const boost::optional & defaultValue, const std::vector & enumMap) override; private: void writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::vector & data); + void writeLICPart(const std::string & fieldName, const std::string & partName, const TEncoder & encoder, const std::set & data); + void writeLICPartBuffer(const std::string & fieldName, const std::string & partName, std::vector & buffer); }; diff --git a/lib/spells/CSpellHandler.cpp b/lib/spells/CSpellHandler.cpp index 97e32a584..7ca3accb6 100644 --- a/lib/spells/CSpellHandler.cpp +++ b/lib/spells/CSpellHandler.cpp @@ -925,7 +925,7 @@ CSpell * CSpellHandler::loadFromJson(const JsonNode & json, const std::string & if("bottom" == vPosStr) newItem.verticalPosition = VerticalPosition::BOTTOM; } - else if(item.getType() == JsonNode::DATA_FLOAT) + else if(item.isNumber()) { newItem.pause = item.Float(); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 33fe8fa21..04423fa86 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -23,8 +23,12 @@ cotire(vcmitest) # Files to copy to the build directory add_custom_target(vcmitestFiles ALL) set(vcmitest_FILES - TerrainViewTest.h3m - terrainViewMappings.json + testdata/TerrainViewTest.h3m + 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}) diff --git a/test/CMapFormatTest.cpp b/test/CMapFormatTest.cpp index 2fa859b86..01e8c0069 100644 --- a/test/CMapFormatTest.cpp +++ b/test/CMapFormatTest.cpp @@ -13,6 +13,7 @@ #include #include "../lib/filesystem/CMemoryBuffer.h" +#include "../lib/filesystem/Filesystem.h" #include "../lib/mapping/CMap.h" #include "../lib/rmg/CMapGenOptions.h" @@ -23,54 +24,41 @@ #include "MapComparer.h" - static const int TEST_RANDOM_SEED = 1337; -static std::unique_ptr initialMap; - -class CMapTestFixture +BOOST_AUTO_TEST_CASE(MapFormat_Random) { -public: - CMapTestFixture() - { - CMapGenOptions opt; + logGlobal->info("MapFormat_Random start"); + BOOST_TEST_CHECKPOINT("MapFormat_Random start"); + std::unique_ptr initialMap; - opt.setHeight(CMapHeader::MAP_SIZE_MIDDLE); - opt.setWidth(CMapHeader::MAP_SIZE_MIDDLE); - opt.setHasTwoLevels(true); - opt.setPlayerCount(4); + CMapGenOptions opt; - opt.setPlayerTypeForStandardPlayer(PlayerColor(0), EPlayerType::HUMAN); - opt.setPlayerTypeForStandardPlayer(PlayerColor(1), EPlayerType::AI); - opt.setPlayerTypeForStandardPlayer(PlayerColor(2), EPlayerType::AI); - opt.setPlayerTypeForStandardPlayer(PlayerColor(3), EPlayerType::AI); + opt.setHeight(CMapHeader::MAP_SIZE_MIDDLE); + opt.setWidth(CMapHeader::MAP_SIZE_MIDDLE); + opt.setHasTwoLevels(true); + 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); - initialMap->name = "Test"; - }; - ~CMapTestFixture() - { - initialMap.reset(); - }; -}; + CMapGenerator gen; -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; { CMapSaverJson saver(&serializeBuffer); saver.saveMap(initialMap); } - BOOST_TEST_CHECKPOINT("CMapFormatVCMI_Simple serialized"); + BOOST_TEST_CHECKPOINT("MapFormat_Random serialized"); #if 1 { - auto path = VCMIDirs::get().userDataPath()/"test.vmap"; + auto path = VCMIDirs::get().userDataPath()/"test_random.vmap"; boost::filesystem::remove(path); 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(path.string()); } - BOOST_TEST_CHECKPOINT("CMapFormatVCMI_Simple saved"); + BOOST_TEST_CHECKPOINT("MapFormat_Random saved"); #endif // 1 @@ -94,5 +82,123 @@ BOOST_AUTO_TEST_CASE(CMapFormatVCMI_Simple) 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(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 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 originalMap; + { + CMemoryBuffer initialBuffer; + + std::shared_ptr 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 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"); } diff --git a/test/CVcmiTestConfig.cpp b/test/CVcmiTestConfig.cpp index 02c42a56b..9aca6b25f 100644 --- a/test/CVcmiTestConfig.cpp +++ b/test/CVcmiTestConfig.cpp @@ -35,7 +35,7 @@ CVcmiTestConfig::CVcmiTestConfig() /* 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*/ - const std::string TEST_DATA_DIR = "test/"; + const std::string TEST_DATA_DIR = "test/testdata/"; auto path = boost::filesystem::current_path(); path+= "/" + TEST_DATA_DIR; if(boost::filesystem::exists(path)){ diff --git a/test/MapComparer.cpp b/test/MapComparer.cpp index b211afa76..6b8692e78 100644 --- a/test/MapComparer.cpp +++ b/test/MapComparer.cpp @@ -13,6 +13,9 @@ #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(field) BOOST_CHECK_EQUAL(actual.field, expected.field) @@ -147,6 +150,7 @@ void checkEqual(const TerrainTile & actual, const TerrainTile & expected) } +//MapComparer void MapComparer::compareHeader() { //map size parameters are vital for further checks @@ -192,7 +196,6 @@ void MapComparer::compareOptions() checkEqual(actual->allowedAbilities, expected->allowedAbilities); checkEqual(actual->allowedArtifact, expected->allowedArtifact); checkEqual(actual->allowedSpell, expected->allowedSpell); - //checkEqual(actual->allowedAbilities, expected->allowedAbilities); //todo: compareOptions events } @@ -272,3 +275,203 @@ void MapComparer::operator() (const std::unique_ptr& actual, const std::un this->expected = expected.get(); compare(); } + +//JsonMapComparer +JsonMapComparer::JsonMapComparer(): + strict(false) +{ + +} + +vstd::ScopeGuard JsonMapComparer::pushName(const std::string & name) +{ + namePath.push_back(name); + return vstd::makeScopeGuard([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); +} diff --git a/test/MapComparer.h b/test/MapComparer.h index a8e4b882c..d31ee357b 100644 --- a/test/MapComparer.h +++ b/test/MapComparer.h @@ -10,7 +10,17 @@ #pragma once -#include "../lib/mapping/CMap.h" +#include "../lib/ScopeGuard.h" +#include "../lib/JsonNode.h" + +namespace vstd +{ + template + class ScopeGuard; +} + +class CMap; +class CGObjectInstance; struct MapComparer { @@ -28,4 +38,40 @@ struct MapComparer void operator() (const std::unique_ptr& actual, const std::unique_ptr& expected); }; +struct JsonMapComparer +{ + typedef std::function TScopeGuard; + + bool strict; + std::list namePath; + + JsonMapComparer(); + + vstd::ScopeGuard 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); +}; + diff --git a/test/testdata/ObjectPropertyTest/header.json b/test/testdata/ObjectPropertyTest/header.json new file mode 100644 index 000000000..906e18205 --- /dev/null +++ b/test/testdata/ObjectPropertyTest/header.json @@ -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 +} diff --git a/test/testdata/ObjectPropertyTest/objects.ex.json b/test/testdata/ObjectPropertyTest/objects.ex.json new file mode 100644 index 000000000..2e3f0e3a0 --- /dev/null +++ b/test/testdata/ObjectPropertyTest/objects.ex.json @@ -0,0 +1,7389 @@ +{ + "mine_0" : { + "l" : 0, + "subtype" : "alchemistLab", + "template" : { + "animation" : "AVMALCH0", + "editorAnimation" : "AVMALCH0", + "mask" : [ + "VVV", + "VVV", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 10, + "y" : 1, + "options" : { + "owner" : "red" + } + }, + "mine_1" : { + "l" : 0, + "subtype" : "crystalCavern", + "template" : { + "animation" : "AVMCRDR0", + "editorAnimation" : "AVMCRDR0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 14, + "y" : 1, + "options" : { + "owner" : "blue" + } + }, + "mine_2" : { + "l" : 0, + "subtype" : "gemPond", + "template" : { + "animation" : "AVMGEDR0", + "editorAnimation" : "AVMGEDR0", + "mask" : [ + "BBB", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ], + "zIndex" : 100 + }, + "type" : "mine", + "x" : 18, + "y" : 1, + "options" : { + "owner" : "tan" + } + }, + "mine_3" : { + "l" : 0, + "subtype" : "goldMine", + "template" : { + "animation" : "AVMGODR0", + "editorAnimation" : "AVMGODR0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 22, + "y" : 1, + "options" : { + "owner" : "green" + } + }, + "mine_4" : { + "l" : 0, + "subtype" : "orePit", + "template" : { + "animation" : "AVMORDR0", + "editorAnimation" : "AVMORDR0", + "mask" : [ + "BBB", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ], + "zIndex" : 100 + }, + "type" : "mine", + "x" : 26, + "y" : 1, + "options" : { + "owner" : "orange" + } + }, + "mine_5" : { + "l" : 0, + "subtype" : "sawmill", + "template" : { + "animation" : "AVMSAWD0", + "editorAnimation" : "AVMSAWD0", + "mask" : [ + "VVVVV", + "VVVBB", + "VBBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 31, + "y" : 1, + "options" : { + "owner" : "purple" + } + }, + "mine_6" : { + "l" : 0, + "subtype" : "sulfurDune", + "template" : { + "animation" : "AVMSULF0", + "editorAnimation" : "AVMSULF0", + "mask" : [ + "VVV", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 35, + "y" : 1, + "options" : { + "owner" : "teal" + } + }, + "mine_7" : { + "l" : 0, + "subtype" : "abandoned", + "template" : { + "animation" : "AVXABND0", + "editorAnimation" : "AVXABND0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 39, + "y" : 1, + "options" : { + "possibleResources" : [ + "mercury", + "ore", + "sulfur", + "crystal", + "gems", + "gold" + ] + } + }, + "mine_8" : { + "l" : 0, + "subtype" : "abandoned", + "template" : { + "animation" : "AVXABND0", + "editorAnimation" : "AVXABND0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 43, + "y" : 1, + "options" : { + "possibleResources" : [ + "mercury" + ] + } + }, + "sign_9" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 4, + "y" : 1 + }, + "sign_10" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 6, + "y" : 1, + "options" : { + "text" : "Previus one have random sign" + } + }, + "oceanBottle_11" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBTTL0", + "editorAnimation" : "AVXBTTL0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "oceanBottle", + "x" : 81, + "y" : 5 + }, + "oceanBottle_12" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBTTL0", + "editorAnimation" : "AVXBTTL0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "oceanBottle", + "x" : 83, + "y" : 5, + "options" : { + "text" : "Other one have random text" + } + }, + "boat_13" : { + "l" : 0, + "subtype" : "evil", + "template" : { + "animation" : "AVXBOAT0", + "editorAnimation" : "AVXBOAT0", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "boat", + "x" : 80, + "y" : 5 + }, + "creatureGeneratorCommon_14" : { + "l" : 0, + "subtype" : "guardhouse", + "template" : { + "animation" : "AVGPIKE0", + "editorAnimation" : "AVGPIKE0", + "mask" : [ + "VVV", + "VBV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "creatureGeneratorCommon", + "x" : 5, + "y" : 8 + }, + "creatureGeneratorCommon_15" : { + "l" : 0, + "subtype" : "archersTower", + "template" : { + "animation" : "AVGCROS0", + "editorAnimation" : "AVGCROS0", + "mask" : [ + "VVV", + "VVV", + "VAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "creatureGeneratorCommon", + "x" : 9, + "y" : 8, + "options" : { + "owner" : "red" + } + }, + "creatureGeneratorCommon_16" : { + "l" : 0, + "subtype" : "griffinTower", + "template" : { + "animation" : "AVGGRFF0", + "editorAnimation" : "AVGGRFF0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "creatureGeneratorCommon", + "x" : 13, + "y" : 8, + "options" : { + "owner" : "tan" + } + }, + "witchHut_17" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVSWTCH0", + "editorAnimation" : "AVSWTCH0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "witchHut", + "x" : 17, + "y" : 8, + "options" : { + "allowedSkills" : { + "anyOf" : [ + "airMagic" + ] + } + } + }, + "witchHut_18" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVSWTCH0", + "editorAnimation" : "AVSWTCH0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "witchHut", + "x" : 20, + "y" : 8, + "options" : { + "allowedSkills" : { + "anyOf" : [ + "airMagic", + "archery", + "armorer", + "artillery" + ] + } + } + }, + "witchHut_19" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVSWTCH0", + "editorAnimation" : "AVSWTCH0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "witchHut", + "x" : 23, + "y" : 8, + "options" : { + "allowedSkills" : { + "anyOf" : [ + "airMagic", + "archery", + "armorer", + "artillery", + "ballistics", + "diplomacy", + "eagleEye", + "earthMagic", + "estates", + "fireMagic", + "firstAid", + "intelligence", + "learning", + "logistics", + "luck", + "mysticism", + "navigation", + "offence", + "pathfinding", + "resistance", + "scholar", + "scouting", + "sorcery", + "tactics", + "waterMagic", + "wisdom" + ] + } + } + }, + "randomDwelling_20" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 5, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "sign_21" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 15, + "y" : 8, + "options" : { + "text" : "Air Magic" + } + }, + "sign_22" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 18, + "y" : 8, + "options" : { + "text" : "Air Magic, Archery, Armorer,Artillery" + } + }, + "sign_23" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 8, + "options" : { + "text" : "Any random skill exclude necromancy (default)" + } + }, + "sign_24" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 8, + "options" : { + "text" : "Not owned by anyone" + } + }, + "sign_25" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 7, + "y" : 8, + "options" : { + "text" : "Owned by red player" + } + }, + "sign_26" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 11, + "y" : 8, + "options" : { + "text" : "Owned by tan player" + } + }, + "sign_27" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 12, + "options" : { + "text" : "Default: not owned by anyone, level 1-7, all alignments" + } + }, + "sign_28" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 15, + "options" : { + "text" : "Owned by red, level 6-7, castle, dungeon or fortress" + } + }, + "randomDwelling_29" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 5, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_30" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 7, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_31" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 9, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_32" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 11, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_33" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 13, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_34" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 7, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_35" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 9, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_36" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 11, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_37" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 13, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "sign_38" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 18, + "options" : { + "text" : "Level 1 template! Owned by tan, rampart of conflux" + } + }, + "randomDwellingLvl_39" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 5, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_40" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 7, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_41" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 9, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_42" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 11, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_43" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 13, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingFaction_44" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 5, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "sign_45" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 22, + "options" : { + "text" : "Conflux template! Owned by teal, level 3-6" + } + }, + "randomDwellingFaction_46" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 7, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "randomDwellingFaction_47" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 9, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "randomDwellingFaction_48" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 11, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "randomDwellingFaction_49" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 13, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "shrineOfMagicLevel1_50" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL1SH0", + "editorAnimation" : "AVXL1SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel1", + "x" : 25, + "y" : 8 + }, + "sign_51" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 24, + "y" : 8, + "options" : { + "text" : "Random level 1 spell" + } + }, + "shrineOfMagicLevel1_52" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL1SH0", + "editorAnimation" : "AVXL1SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel1", + "x" : 28, + "y" : 8, + "options" : { + "spell" : "haste" + } + }, + "sign_53" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 27, + "y" : 8, + "options" : { + "text" : "Level 1 spell: Haste " + } + }, + "shrineOfMagicLevel2_54" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL2SH0", + "editorAnimation" : "AVXL2SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel2", + "x" : 31, + "y" : 8 + }, + "sign_55" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 30, + "y" : 8, + "options" : { + "text" : "Random level 2 spell" + } + }, + "sign_56" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 33, + "y" : 8, + "options" : { + "text" : "Level 2 spell: Quicksand" + } + }, + "shrineOfMagicLevel2_57" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL2SH0", + "editorAnimation" : "AVXL2SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel2", + "x" : 34, + "y" : 8, + "options" : { + "spell" : "quicksand" + } + }, + "shrineOfMagicLevel3_58" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL3SH0", + "editorAnimation" : "AVXL3SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel3", + "x" : 37, + "y" : 8 + }, + "shrineOfMagicLevel3_59" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL3SH0", + "editorAnimation" : "AVXL3SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel3", + "x" : 40, + "y" : 8, + "options" : { + "spell" : "teleport" + } + }, + "sign_60" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 36, + "y" : 8, + "options" : { + "text" : "Random level 3 spell" + } + }, + "sign_61" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 39, + "y" : 8, + "options" : { + "text" : "Level 3 spell: teleport" + } + }, + "lighthouse_62" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXLTHS0", + "editorAnimation" : "AVXLTHS0", + "mask" : [ + "VVV", + "VVV", + "VVV", + "VVA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "lighthouse", + "x" : 43, + "y" : 8, + "options" : { + "owner" : "green" + } + }, + "sign_63" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 42, + "y" : 8, + "options" : { + "text" : "Owned by green player" + } + }, + "garrisonHorizontal_64" : { + "l" : 0, + "subtype" : "normal", + "template" : { + "animation" : "AVCGAR10", + "editorAnimation" : "AVCGAR10", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 48, + "y" : 8, + "options" : { + "owner" : "blue", + "removableUnits" : true + } + }, + "sign_65" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 45, + "y" : 8, + "options" : { + "text" : "Owned by blue player and troops are removable (default)" + } + }, + "garrisonHorizontal_66" : { + "l" : 0, + "subtype" : "normal", + "template" : { + "animation" : "AVCGAR10", + "editorAnimation" : "AVCGAR10", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 53, + "y" : 8, + "options" : { + "owner" : "blue" + } + }, + "sign_67" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 50, + "y" : 8, + "options" : { + "text" : "Owned by blue player and troops are NOT removable" + } + }, + "garrisonHorizontal_68" : { + "l" : 0, + "subtype" : "antiMagic", + "template" : { + "animation" : "AVCGAR20", + "editorAnimation" : "AVCGAR20", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 58, + "y" : 8, + "options" : { + "army" : [ + { + "amount" : 100, + "type" : "enchanter" + }, + {}, + {}, + {}, + { + "amount" : 10, + "type" : "azureDragon" + }, + {}, + {} + ], + "owner" : "red" + } + }, + "sign_69" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 55, + "y" : 8, + "options" : { + "text" : "Owned by red player, troops are NOT removable and contain following troops: slot 1 - 100 enchanters, slot 5 - 10 azure dragons" + } + }, + "garrisonHorizontal_70" : { + "l" : 0, + "subtype" : "antiMagic", + "template" : { + "animation" : "AVCGAR20", + "editorAnimation" : "AVCGAR20", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 63, + "y" : 8, + "options" : { + "army" : [ + { + "amount" : 11, + "type" : "gremlin" + }, + { + "amount" : 12, + "type" : "masterGremlin" + }, + { + "amount" : 13, + "type" : "stoneGargoyle" + }, + { + "amount" : 14, + "type" : "obsidianGargoyle" + }, + { + "amount" : 15, + "type" : "ironGolem" + }, + { + "amount" : 16, + "type" : "stoneGolem" + }, + { + "amount" : 17, + "type" : "mage" + } + ] + } + }, + "sign_71" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 60, + "y" : 8, + "options" : { + "text" : "NOT owned by anyone, troops are removable and contain following troops: slot 1 - 11 gremlins, slot 2 - 12 master gremlins, slot 3 - 13 stone garg, etc" + } + }, + "scholar_72" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 66, + "y" : 8 + }, + "scholar_73" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 69, + "y" : 8, + "options" : { + "rewardPrimSkill" : "attack" + } + }, + "scholar_74" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 72, + "y" : 8, + "options" : { + "rewardPrimSkill" : "defence" + } + }, + "shipyard_75" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSHYD0", + "editorAnimation" : "AVXSHYD0", + "mask" : [ + "VVV", + "VVV", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shipyard", + "x" : 81, + "y" : 12, + "options" : { + "owner" : "pink" + } + }, + "sign_76" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 78, + "y" : 12, + "options" : { + "text" : "Owned by pink player" + } + }, + "sign_77" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 65, + "y" : 8, + "options" : { + "text" : "Random reward" + } + }, + "sign_78" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 68, + "y" : 8, + "options" : { + "text" : "Primary skill: attack" + } + }, + "sign_79" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 71, + "y" : 8, + "options" : { + "text" : "Primary skill: defense" + } + }, + "sign_80" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 74, + "y" : 8, + "options" : { + "text" : "Primary skill: spell power" + } + }, + "sign_81" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 77, + "y" : 8, + "options" : { + "text" : "Primary skill: knowledge" + } + }, + "scholar_82" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 75, + "y" : 8, + "options" : { + "rewardPrimSkill" : "spellpower" + } + }, + "scholar_83" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 78, + "y" : 8, + "options" : { + "rewardPrimSkill" : "knowledge" + } + }, + "scholar_84" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 66, + "y" : 10, + "options" : { + "rewardSkill" : "sorcery" + } + }, + "sign_85" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 65, + "y" : 10, + "options" : { + "text" : "Secondary skill: sorcery" + } + }, + "sign_86" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 68, + "y" : 10, + "options" : { + "text" : "Secondary skill: first aid" + } + }, + "scholar_87" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 69, + "y" : 10, + "options" : { + "rewardSkill" : "firstAid" + } + }, + "sign_88" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 71, + "y" : 10, + "options" : { + "text" : "Spell: stone skin" + } + }, + "scholar_89" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 72, + "y" : 10, + "options" : { + "rewardSpell" : "stoneSkin" + } + }, + "scholar_90" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 75, + "y" : 10, + "options" : { + "rewardSpell" : "fly" + } + }, + "sign_91" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 74, + "y" : 10, + "options" : { + "text" : "Spell: fly" + } + }, + "sign_92" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 59, + "y" : 20, + "options" : { + "text" : "EVENT TESTING ZONE" + } + }, + "sign_93" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 61, + "y" : 18, + "options" : { + "text" : "Message: test. All players. Computer players can trigger" + } + }, + "sign_94" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 65, + "y" : 18, + "options" : { + "text" : "Message: lol, computers CANT trigger, disappear after visit, players 1,3,5 creatures: archer, basilik, pegasus (1 of each)" + } + }, + "sign_95" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 69, + "y" : 18, + "options" : { + "text" : "all non default: messagenondefault, players 1,8; allow comp trigger; don't cancel; guardians, pikeman, halberdman, etc; take -777 spell points" + } + }, + "sign_96" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 73, + "y" : 18, + "options" : { + "text" : "All pos: 99 999 999 exp, 999 spell points, morale\/luck +3, res 9,8,7,6,5,4,3;pskills: 1,2,3,4; sskill: adv. offence; art: rib cage, sp: blind, 1 troll" + } + }, + "event_97" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 62, + "y" : 18, + "options" : { + "aIActivable" : true, + "guardMessage" : "test", + "removeAfterVisit" : true + } + }, + "event_98" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 66, + "y" : 18, + "options" : { + "availableFor" : [ + "red", + "tan", + "orange" + ], + "guards" : [ + { + "amount" : 1, + "type" : "archer" + }, + { + "amount" : 1, + "type" : "basilisk" + }, + { + "amount" : 1, + "type" : "pegasus" + }, + {}, + {}, + {}, + {} + ], + "removeAfterVisit" : true + } + }, + "event_99" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 74, + "y" : 18, + "options" : { + "artifacts" : [ + "ribCage" + ], + "creatures" : [ + { + "amount" : 1, + "type" : "troll" + } + ], + "experience" : 99999999, + "luck" : 3, + "mana" : 999, + "morale" : 3, + "primarySkills" : { + "attack" : 1, + "defence" : 2, + "knowledge" : 4, + "spellpower" : 3 + }, + "removeAfterVisit" : true, + "resources" : { + "crystal" : 5, + "gems" : 4, + "gold" : 3, + "mercury" : 8, + "ore" : 7, + "sulfur" : 6, + "wood" : 9 + }, + "secondarySkills" : { + "offence" : "advanced" + }, + "spells" : [ + "blind" + ] + } + }, + "event_100" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 70, + "y" : 18, + "options" : { + "aIActivable" : true, + "availableFor" : [ + "red", + "pink" + ], + "guardMessage" : "messagenondefault", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "pikeman" + } + ], + "mana" : -777 + } + }, + "hero_101" : { + "l" : 0, + "subtype" : "cleric", + "template" : { + "animation" : "AH01_E", + "editorAnimation" : "AH01_E", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "hero", + "x" : 2, + "y" : 1, + "options" : { + "army" : [ + { + "amount" : 1, + "type" : "crystalDragon" + }, + { + "amount" : 1, + "type" : "fairieDragon" + }, + { + "amount" : 1, + "type" : "rustDragon" + }, + { + "amount" : 1, + "type" : "azureDragon" + }, + {}, + {}, + {} + ], + "artifacts" : { + "feet" : "bootsOfLevitation", + "spellbook" : "spellBook" + }, + "biography" : "321", + "owner" : "red", + "primarySkills" : { + "attack" : 55, + "defence" : 44, + "knowledge" : 22, + "spellpower" : 33 + }, + "secondarySkills" : { + "wisdom" : "expert", + "sorcery" : "expert" + }, + "spellBook" : [ + "fly" + ], + "tightFormation" : true, + "type" : "ingham" + } + }, + "sign_102" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 0, + "y" : 1, + "options" : { + "text" : "Hero: Ingham, bio:321,prim skills:55,44,33,22,spells:fly,arts:spellbook,boots of levithation,creatures:4 dragons,grouped,s skills:wisdom,sorcery exper" + } + }, + "randomHero_103" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 124, + "y" : 143, + "options" : { + "owner" : "tan" + } + }, + "randomHero_104" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 119, + "y" : 143, + "options" : { + "owner" : "blue" + } + }, + "randomHero_105" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 129, + "y" : 143, + "options" : { + "owner" : "green" + } + }, + "randomHero_106" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 134, + "y" : 143, + "options" : { + "owner" : "orange" + } + }, + "randomHero_107" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 139, + "y" : 143, + "options" : { + "owner" : "purple" + } + }, + "randomHero_108" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 144, + "y" : 143, + "options" : { + "owner" : "teal" + } + }, + "randomHero_109" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 114, + "y" : 143, + "options" : { + "owner" : "pink" + } + }, + "event_110" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 78, + "y" : 18, + "options" : { + "removeAfterVisit" : true + } + }, + "event_111" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 82, + "y" : 18, + "options" : { + "artifacts" : [ + "admiralsHat", + "ambassadorsSash", + "amuletOfTheUndertaker", + "angelFeatherArrows", + "angelWings", + "angelicAlliance", + "angelicAlliance", + "armageddonsBlade", + "armorOfTheDamned", + "armorOfWonder", + "badgeOfCourage", + "birdOfPerception", + "blackshardOfTheDeadKnight", + "bootsOfLevitation", + "bootsOfPolarity", + "bootsOfSpeed", + "bowOfElvenCherrywood", + "bowOfTheSharpshooter", + "bowstringOfTheUnicornsMane", + "breastplateOfBrimstone", + "breastplateOfPetrifiedWood", + "bucklerOfTheGnollKing", + "capeOfVelocity", + "cardsOfProphecy", + "celestialNecklaceOfBliss", + "centaurAxe", + "charmOfMana", + "cloakOfTheUndeadKing", + "cloverOfFortune", + "collarOfConjuring", + "cornucopia", + "crestOfValor", + "capeOfConjuring", + "crownOfDragontooth", + "crownOfTheSupremeMagi", + "deadMansBoots", + "diplomatsRing", + "dragonScaleArmor", + "dragonScaleShield", + "dragonWingTabard", + "dragonboneGreaves", + "elixirOfLife", + "emblemOfCognizance", + "endlessPurseOfGold", + "endlessSackOfGold", + "endlessBagOfGold", + "equestriansGloves", + "everflowingCrystalCloak", + "everpouringVialOfMercury", + "eversmokingRingOfSulfur", + "garnitureOfInterference", + "glyphOfGallantry", + "goldenBow", + "greaterGnollsFlail", + "headOfLegion", + "hellstormHelmet", + "hellstormHelmet", + "helmOfChaos", + "helmOfHeavenlyEnlightenment", + "helmOfTheAlabasterUnicorn", + "helmOfTheAlabasterUnicorn", + "hourglassOfTheEvilHour", + "inexhaustibleCartOfLumber", + "inexhaustibleCartOfOre" + ], + "removeAfterVisit" : true + } + }, + "event_112" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 86, + "y" : 18, + "options" : { + "removeAfterVisit" : true, + "spells" : [ + "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", + "protectEarth", + "protectWater", + "protectAir", + "protectFire", + "quicksand", + "removeObstacle", + "resurrection", + "sacrifice", + "scuttleBoat", + "shield", + "slayer", + "slow", + "sorrow", + "stoneSkin", + "summonBoat", + "teleport", + "townPortal", + "viewAir", + "viewEarth", + "visions", + "waterElemental", + "waterWalk", + "weakness" + ] + } + }, + "event_113" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 90, + "y" : 18, + "options" : { + "creatures" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + } + ], + "removeAfterVisit" : true + } + }, + "event_114" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "0" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 94, + "y" : 18, + "options" : { + "creatures" : [ + { + "amount" : 9999, + "type" : "rustDragon" + }, + { + "amount" : 9999, + "type" : "fairieDragon" + }, + { + "amount" : 9999, + "type" : "crystalDragon" + }, + { + "amount" : 9999, + "type" : "azureDragon" + }, + { + "amount" : 9999, + "type" : "enchanter" + }, + { + "amount" : 9999, + "type" : "diamondGolem" + }, + { + "amount" : 9999, + "type" : "troll" + } + ], + "removeAfterVisit" : true + } + }, + "sign_115" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 77, + "y" : 18, + "options" : { + "text" : "give 30 wizard well's" + } + }, + "sign_116" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 81, + "y" : 18, + "options" : { + "text" : "Give 64 first artifacts up to Inexhaustible card of Ore" + } + }, + "sign_117" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 85, + "y" : 18, + "options" : { + "text" : "gives all possible spells" + } + }, + "sign_118" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 89, + "y" : 18, + "options" : { + "text" : "Give 7 stacks of 1 pikeman" + } + }, + "sign_119" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 93, + "y" : 18, + "options" : { + "text" : "Give 9999 of each last creature in list: Rust, Faerie, Azure, Crystal dragons, Enchanters, Diamond Golems, Trolls" + } + }, + "sign_120" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 32, + "options" : { + "text" : "Resource template: default" + } + }, + "randomResource_121" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 4, + "y" : 32 + }, + "randomResource_122" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 5, + "y" : 32 + }, + "randomResource_123" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 6, + "y" : 32 + }, + "randomResource_124" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 7, + "y" : 32 + }, + "randomResource_125" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 8, + "y" : 32 + }, + "sign_126" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 34, + "options" : { + "text" : "Resource template: amount 150" + } + }, + "randomResource_127" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 4, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_128" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 5, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_129" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 6, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_130" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 7, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_131" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 8, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "sign_132" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 36, + "options" : { + "text" : "Resource template: amount 255, message:testresource, creatures: pikeman, halberdier, archer (slots and amount 1,2,3) and 15 fairie dragons (slot 7)" + } + }, + "randomResource_133" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 4, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_134" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 5, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_135" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 6, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_136" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 7, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_137" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 8, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "resource_138" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 38 + }, + "sign_139" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 38, + "options" : { + "text" : "Resource crystal: default" + } + }, + "sign_140" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 40, + "options" : { + "text" : "Resource crystal: default, amount 400" + } + }, + "resource_141" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 40, + "options" : { + "amount" : 400 + } + }, + "sign_142" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 42, + "options" : { + "text" : "Resource crystal: default, amount 500, message: crystalalot" + } + }, + "resource_143" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 42, + "options" : { + "amount" : 500, + "guardMessage" : "crystalalot" + } + }, + "sign_144" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 44, + "options" : { + "text" : "Resource crystal: default, amount 600, message: crystalguard, creatures: 100 rust dragons (slot 1)" + } + }, + "resource_145" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 44, + "options" : { + "amount" : 600, + "guardMessage" : "crystalguard", + "guards" : [ + { + "amount" : 100, + "type" : "rustDragon" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "sign_146" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 46, + "options" : { + "text" : "Spell scroll: default (always magic arrow?)" + } + }, + "spellScroll_147" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0001", + "editorAnimation" : "AVA0001", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "spellScroll", + "x" : 4, + "y" : 46, + "options" : { + "spell" : "magicArrow" + } + }, + "sign_148" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 48, + "options" : { + "text" : "Spell scroll: spell prayer, message \"prayerspell\"" + } + }, + "spellScroll_149" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0001", + "editorAnimation" : "AVA0001", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "spellScroll", + "x" : 4, + "y" : 48, + "options" : { + "guardMessage" : "prayerspell", + "spell" : "prayer" + } + }, + "sign_150" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 50, + "options" : { + "text" : "Spell scroll: spell inferno, message \"infernospell\", creatures: slot 6 - 666 devils" + } + }, + "spellScroll_151" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0001", + "editorAnimation" : "AVA0001", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "spellScroll", + "x" : 4, + "y" : 50, + "options" : { + "guardMessage" : "infernospell", + "guards" : [ + {}, + {}, + {}, + {}, + {}, + { + "amount" : 666, + "type" : "devil" + }, + {} + ], + "spell" : "inferno" + } + }, + "artifact_152" : { + "l" : 0, + "subtype" : "centaurAxe", + "template" : { + "animation" : "AVA0007", + "editorAnimation" : "AVA0007", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "artifact", + "x" : 4, + "y" : 52 + }, + "sign_153" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 52, + "options" : { + "text" : "Artifact centaurs axe: default" + } + }, + "sign_154" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 54, + "options" : { + "text" : "Artifact centaurs axe: message longtext" + } + }, + "artifact_155" : { + "l" : 0, + "subtype" : "centaurAxe", + "template" : { + "animation" : "AVA0007", + "editorAnimation" : "AVA0007", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "artifact", + "x" : 4, + "y" : 54, + "options" : { + "guardMessage" : "longtext" + } + }, + "sign_156" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 56, + "options" : { + "text" : "Artifact centaurs axe: message trolled, creatures: slot 3 - 44 trolls" + } + }, + "artifact_157" : { + "l" : 0, + "subtype" : "centaurAxe", + "template" : { + "animation" : "AVA0007", + "editorAnimation" : "AVA0007", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "artifact", + "x" : 4, + "y" : 56, + "options" : { + "guardMessage" : "trolled", + "guards" : [ + {}, + {}, + { + "amount" : 44, + "type" : "troll" + }, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_158" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 4, + "y" : 58 + }, + "sign_159" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 58, + "options" : { + "text" : "Artifact template: default" + } + }, + "randomArtifact_160" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 5, + "y" : 58 + }, + "randomArtifact_161" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 6, + "y" : 58 + }, + "randomArtifact_162" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 7, + "y" : 58 + }, + "randomArtifact_163" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 8, + "y" : 58 + }, + "sign_164" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 60, + "options" : { + "text" : "Artifact template: message \"artifactdefault\", creatures slot 1 -: 500 mages" + } + }, + "randomArtifact_165" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 4, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_166" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 5, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_167" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 6, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_168" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 7, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_169" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 8, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifactMajor_170" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 4, + "y" : 62 + }, + "sign_171" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 62, + "options" : { + "text" : "Artifact template 3: default" + } + }, + "randomArtifactMajor_172" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 5, + "y" : 62 + }, + "randomArtifactMajor_173" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 6, + "y" : 62 + }, + "randomArtifactMajor_174" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 8, + "y" : 62 + }, + "randomArtifactMajor_175" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 7, + "y" : 62 + }, + "sign_176" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 64, + "options" : { + "text" : "Artifact template 3: message \"artifactthree\", creatures: slot 3 - 333 of royal griffins" + } + }, + "randomArtifactMajor_177" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 4, + "y" : 64, + "options" : { + "guardMessage" : "artifactthree", + "guards" : [ + {}, + {}, + { + "amount" : 333, + "type" : "royalGriffin" + }, + {}, + {}, + {}, + {} + ] + } + }, + "pandoraBox_178" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 66 + }, + "sign_179" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 66, + "options" : { + "text" : "Pandora box: default" + } + }, + "sign_180" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 68, + "options" : { + "text" : "Pandora box: message \"giveexp\", creatures: slot 5 - 5 pixies, take mana points -555" + } + }, + "pandoraBox_181" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 68, + "options" : { + "guardMessage" : "giveexp", + "guards" : [ + {}, + {}, + {}, + {}, + { + "amount" : 5, + "type" : "pixie" + }, + {}, + {} + ], + "mana" : -555 + } + }, + "sign_182" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 70, + "options" : { + "text" : "Pandora box: 1000exp, give 100 mana points, +3 morale, +2 luck, resource + 9,8,7,6,5,4, primary skills +9,8,7,6" + } + }, + "pandoraBox_183" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 70, + "options" : { + "experience" : 1000, + "luck" : 2, + "mana" : 100, + "morale" : 3, + "primarySkills" : { + "attack" : 9, + "defence" : 8, + "knowledge" : 6, + "spellpower" : 7 + }, + "resources" : { + "crystal" : 6, + "gems" : 5, + "gold" : 4, + "mercury" : 9, + "ore" : 8, + "sulfur" : 7, + "wood" : 10 + } + } + }, + "sign_184" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 72, + "options" : { + "text" : "Pandora box: secondar skills: expert pathfinding, advanced wisdom, basic necromancy, expert armorer" + } + }, + "pandoraBox_185" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 72, + "options" : { + "secondarySkills" : { + "pathfinding" : "expert", + "wisdom" : "advanced", + "necromancy" : "basic", + "armorer" : "expert" + } + } + }, + "sign_186" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 74, + "options" : { + "text" : "Pandora box: artifacts: angel winge, helm of chaos, wizards well, spells: armageddon, water elemental; creatures: 111 crusader, 100 rogues" + } + }, + "pandoraBox_187" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 74, + "options" : { + "artifacts" : [ + "angelWings", + "helmOfChaos", + "wizardsWell" + ], + "creatures" : [ + { + "amount" : 111, + "type" : "crusader" + }, + { + "amount" : 100, + "type" : "rogue" + } + ], + "spells" : [ + "armageddon", + "waterElemental" + ] + } + }, + "town_188" : { + "l" : 0, + "subtype" : "castle", + "template" : { + "animation" : "AVCCASX0", + "editorAnimation" : "AVCCASX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "town", + "x" : 26, + "y" : 14, + "options" : { + "army" : [ + { + "amount" : 7, + "type" : "pikeman" + }, + { + "amount" : 6, + "type" : "archer" + }, + { + "amount" : 5, + "type" : "griffin" + }, + { + "amount" : 4, + "type" : "swordsman" + }, + { + "amount" : 3, + "type" : "monk" + }, + { + "amount" : 2, + "type" : "cavalier" + }, + { + "amount" : 1, + "type" : "angel" + } + ], + "buildings" : {}, + "hasFort" : false, + "spells" : {}, + "tightFormation" : true + } + }, + "sign_189" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 14, + "options" : { + "text" : "Don't owned by anyone, dont have fort, non-upgraded creatures: 7,6,5,4,3,2,1" + } + }, + "randomTown_190" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVCRANX0", + "editorAnimation" : "AVCRANX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomTown", + "x" : 26, + "y" : 21, + "options" : { + "buildings" : { + "allOf" : [ + "blacksmith", + "capitol", + "castle", + "citadel", + "cityHall", + "dwellingLvl1", + "dwellingLvl2", + "dwellingLvl3", + "dwellingLvl4", + "dwellingLvl5", + "dwellingLvl6", + "dwellingLvl7", + "dwellingUpLvl1", + "dwellingUpLvl2", + "dwellingUpLvl3", + "dwellingUpLvl4", + "dwellingUpLvl5", + "dwellingUpLvl6", + "dwellingUpLvl7", + "fort", + "grail", + "horde1", + "horde2", + "horde3", + "horde4", + "horde5", + "mageGuild1", + "mageGuild2", + "mageGuild3", + "mageGuild4", + "mageGuild5", + "marketplace", + "resourceSilo", + "shipyard", + "tavern", + "townHall" + ] + }, + "name" : "TownAsRed", + "spells" : {} + } + }, + "sign_191" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 21, + "options" : { + "text" : "Same as red player, name \"TownAsRed\". everything built" + } + }, + "randomTown_192" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVCRANX0", + "editorAnimation" : "AVCRANX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomTown", + "x" : 26, + "y" : 27, + "options" : { + "buildings" : {}, + "hasFort" : false, + "spells" : {} + } + }, + "sign_193" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 27, + "options" : { + "text" : "Don't have fort, one timed evernt on day 3, every 3 days" + } + }, + "randomTown_194" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVCRANX0", + "editorAnimation" : "AVCRANX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomTown", + "x" : 26, + "y" : 32, + "options" : { + "buildings" : { + "allOf" : [ + "grail" + ], + "noneOf" : [ + "blacksmith", + "dwellingLvl1", + "dwellingLvl2", + "dwellingLvl3", + "dwellingLvl4", + "dwellingLvl5", + "dwellingLvl6", + "dwellingLvl7", + "fort", + "mageGuild1", + "marketplace", + "shipyard", + "tavern", + "townHall" + ] + }, + "spells" : {} + } + }, + "sign_195" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 32, + "options" : { + "text" : "Don't have fort, all buildings blocked, grail built" + } + }, + "seerHut_196" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 4, + "y" : 83, + "options" : { + "quest" : {}, + "reward" : {} + } + }, + "sign_197" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 83, + "options" : { + "text" : "Default quest objects: empty" + } + }, + "sign_198" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 86, + "options" : { + "text" : "Require red player, deadline 1 month, reward 999 diamond golems, messages: text1one, text2two, text3three" + } + }, + "seerHut_199" : { + "l" : 0, + "subtype" : "0", + "template" : { + "animation" : "AVXSEER0", + "editorAnimation" : "AVXSEER0", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 6, + "y" : 83, + "options" : { + "quest" : {}, + "reward" : {} + } + }, + "seerHut_200" : { + "l" : 0, + "subtype" : "1", + "template" : { + "animation" : "AVXSEEY0", + "editorAnimation" : "AVXSEEY0", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 8, + "y" : 83, + "options" : { + "quest" : {}, + "reward" : {} + } + }, + "seerHut_201" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 4, + "y" : 86, + "options" : { + "quest" : { + "completedText" : "text3three", + "firstVisitText" : "text1one", + "missionType" : "Player", + "nextVisitText" : "text2two", + "player" : "red", + "timeLimit" : 28 + }, + "reward" : { + "creature.diamondGolem" : 999 + } + } + }, + "questGuard_202" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 19, + "y" : 83, + "options" : { + "quest" : {} + } + }, + "questGuard_203" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 22, + "y" : 83, + "options" : { + "quest" : { + "missionType" : "Resources", + "resources" : { + "crystal" : 5, + "gems" : 6, + "gold" : 7, + "mercury" : 2, + "ore" : 3, + "sulfur" : 4, + "wood" : 1 + }, + "timeLimit" : 56 + } + } + }, + "questGuard_204" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 25, + "y" : 83, + "options" : { + "quest" : { + "completedText" : "testextthree", + "firstVisitText" : "testextone", + "missionType" : "PrimaryStat", + "nextVisitText" : "testexttwo", + "primarySkills" : { + "attack" : 5, + "defence" : 6, + "knowledge" : 8, + "spellpower" : 7 + } + } + } + }, + "questGuard_205" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 28, + "y" : 83, + "options" : { + "quest" : { + "heroLevel" : 4, + "missionType" : "Level", + "timeLimit" : 4 + } + } + }, + "sign_206" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 18, + "y" : 83, + "options" : { + "text" : "Quest guard: empty default" + } + }, + "sign_207" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 83, + "options" : { + "text" : "Quest guard: require 1,2,3,4,5,6,7 resources, deadline 3 months, " + } + }, + "sign_208" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 24, + "y" : 83, + "options" : { + "text" : "Quest guard: require skill 5,6,7,8; Texts: testextone, testexttwo, testextthree" + } + }, + "sign_209" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 27, + "y" : 83, + "options" : { + "text" : "Quest guard: require level 4, deadline 5 days" + } + }, + "sign_210" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 30, + "y" : 83, + "options" : { + "text" : "Quest guard: defeat specific hero: Orrin" + } + }, + "questGuard_211" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 31, + "y" : 83, + "options" : { + "quest" : { + "killTarget" : "prison_266", + "missionType" : "KillHero" + } + } + }, + "sign_212" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 33, + "y" : 83, + "options" : { + "text" : "Quest guard: defeat specific monster: Pikeman above" + } + }, + "questGuard_213" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 34, + "y" : 83, + "options" : { + "quest" : { + "killTarget" : "monster_214", + "missionType" : "KillCreature" + } + } + }, + "monster_214" : { + "l" : 0, + "subtype" : "pikeman", + "template" : { + "animation" : "AVWPIKE", + "editorAnimation" : "AVWPIKE", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "monster", + "x" : 34, + "y" : 81, + "options" : { + "character" : "aggressive" + } + }, + "sign_215" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 36, + "y" : 83, + "options" : { + "text" : "Quest guard: return with specific artifact: diplomat's ring" + } + }, + "questGuard_216" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 37, + "y" : 83, + "options" : { + "quest" : { + "artifacts" : [ + "diplomatsRing" + ], + "missionType" : "Artifact" + } + } + }, + "sign_217" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 39, + "y" : 83, + "options" : { + "text" : "Quest guard: return with specific creature: 1 azure dragon" + } + }, + "questGuard_218" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 40, + "y" : 83, + "options" : { + "quest" : { + "creatures" : [ + { + "amount" : 1, + "type" : "azureDragon" + } + ], + "missionType" : "Army" + } + } + }, + "sign_219" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 42, + "y" : 83, + "options" : { + "text" : "Quest guard: be specific hero: Wizard, Solmyr" + } + }, + "questGuard_220" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 43, + "y" : 83, + "options" : { + "quest" : { + "hero" : "solmyr", + "missionType" : "Hero" + } + } + }, + "sign_221" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 42, + "y" : 85, + "options" : { + "text" : "Quest guard: belong to player: teal" + } + }, + "questGuard_222" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 43, + "y" : 85, + "options" : { + "quest" : { + "missionType" : "Player", + "player" : "teal" + } + } + }, + "randomMonster_223" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 89, + "options" : { + "character" : "aggressive" + } + }, + "sign_224" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 89, + "options" : { + "text" : "monster template: default" + } + }, + "sign_225" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 91, + "options" : { + "text" : "monster template: custom amount 543" + } + }, + "randomMonster_226" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 91, + "options" : { + "amount" : 543, + "character" : "aggressive" + } + }, + "sign_227" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 93, + "options" : { + "text" : "monster template: custom amount 432, don't grow, savage, never flees, message: savagemonster" + } + }, + "sign_228" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 95, + "options" : { + "text" : "monster template: treasure resources: 1,2,3,4,5,6,7 and artifact: diplomat's ring" + } + }, + "sign_229" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 97, + "options" : { + "text" : "monster template: treasure artifact: angel wings" + } + }, + "sign_230" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 99, + "options" : { + "text" : "monster template: message: treasureresources; treature resources: wood 10, gold 1000" + } + }, + "sign_231" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 101, + "options" : { + "text" : "monster template all non-default options: quanlity don't grow 1, complaint, never flees, msg test123, resource treasure: 7,6,5,4,3,2,1, art: spyglass" + } + }, + "randomMonster_232" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 95, + "options" : { + "character" : "aggressive", + "rewardArtifact" : "diplomatsRing", + "rewardResources" : { + "crystal" : 5, + "gems" : 6, + "gold" : 7, + "mercury" : 2, + "ore" : 3, + "sulfur" : 4, + "wood" : 1 + } + } + }, + "randomMonster_233" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 97, + "options" : { + "character" : "aggressive", + "rewardArtifact" : "angelWings" + } + }, + "randomMonster_234" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 99, + "options" : { + "character" : "aggressive", + "neverFlees" : true, + "rewardMessage" : "treasureresources", + "rewardResources" : { + "gold" : 1000, + "wood" : 10 + } + } + }, + "randomMonster_235" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 101, + "options" : { + "amount" : 1, + "character" : "compliant", + "neverFlees" : true, + "noGrowing" : true, + "rewardArtifact" : "spyglass", + "rewardMessage" : "test123", + "rewardResources" : { + "crystal" : 3, + "gems" : 2, + "gold" : 1, + "mercury" : 6, + "ore" : 5, + "sulfur" : 4, + "wood" : 7 + } + } + }, + "randomMonster_236" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 93, + "options" : { + "amount" : 432, + "character" : "savage", + "neverFlees" : true, + "noGrowing" : true, + "rewardMessage" : "savagemonster" + } + }, + "sign_237" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 103, + "options" : { + "text" : "monster lvl 7 template: random quanlity don't grow, hostile, never flees" + } + }, + "randomMonsterLevel7_238" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMON7", + "editorAnimation" : "AVWMON7", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonsterLevel7", + "x" : 3, + "y" : 103, + "options" : { + "character" : "hostile", + "neverFlees" : true, + "noGrowing" : true + } + }, + "sign_239" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 5, + "y" : 86, + "options" : { + "text" : "Require achieve level 99; reward: 100 exp" + } + }, + "seerHut_240" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 7, + "y" : 86, + "options" : { + "quest" : { + "heroLevel" : 99, + "missionType" : "Level" + }, + "reward" : { + "experience" : 100 + } + } + }, + "sign_241" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 8, + "y" : 86, + "options" : { + "text" : "Require: achieve primary skills: 5,4,3,2; reward: 999 mana" + } + }, + "seerHut_242" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 10, + "y" : 86, + "options" : { + "quest" : { + "missionType" : "PrimaryStat", + "primarySkills" : { + "attack" : 5, + "defence" : 4, + "knowledge" : 2, + "spellpower" : 3 + } + }, + "reward" : { + "mana" : 999 + } + } + }, + "seerHut_243" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 13, + "y" : 86, + "options" : { + "quest" : { + "killTarget" : "prison_263", + "missionType" : "KillHero" + }, + "reward" : { + "morale" : 3 + } + } + }, + "sign_244" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 11, + "y" : 86, + "options" : { + "text" : "Require: defeat specific hero: Valeska the Knight; reward: morale +3 " + } + }, + "seerHut_245" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 16, + "y" : 86, + "options" : { + "quest" : { + "killTarget" : "monster_214", + "missionType" : "KillCreature" + }, + "reward" : { + "luck" : 2 + } + } + }, + "sign_246" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 14, + "y" : 86, + "options" : { + "text" : "Require: defeat specific monster: Pikeman at quest guard; reward: luck +2" + } + }, + "sign_247" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 17, + "y" : 86, + "options" : { + "text" : "Require: return with artifacts: angel wings; reward: 99999 gold" + } + }, + "seerHut_248" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 19, + "y" : 86, + "options" : { + "quest" : { + "artifacts" : [ + "angelWings" + ], + "missionType" : "Artifact" + }, + "reward" : { + "resource.gold" : 99999 + } + } + }, + "sign_249" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 20, + "y" : 86, + "options" : { + "text" : "Require: creature 100 archers ; reward: 99 knowledge" + } + }, + "sign_250" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 23, + "y" : 86, + "options" : { + "text" : "Require: resources 10,20,30,40,50,60,70 ; reward: expert Necromancy" + } + }, + "sign_251" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 29, + "y" : 86, + "options" : { + "text" : "Require: belong to specific player Purple; reward: spell Fly" + } + }, + "sign_252" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 26, + "y" : 86, + "options" : { + "text" : "Require: be specific hero Catherine the Knight ; reward: artifact Angelic Alliance" + } + }, + "sign_253" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 32, + "y" : 86, + "options" : { + "text" : "Require: return with 8 artifacts: angel wings - bird of perception; reward: 777 cyclops knight" + } + }, + "sign_254" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 35, + "y" : 86, + "options" : { + "text" : "Require: return with 7 creatures: pikeman - marksman ; reward: none" + } + }, + "seerHut_255" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 22, + "y" : 86, + "options" : { + "quest" : { + "creatures" : [ + { + "amount" : 100, + "type" : "archer" + } + ], + "missionType" : "Army" + }, + "reward" : { + "primarySkill.knowledge" : 99 + } + } + }, + "seerHut_256" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 25, + "y" : 86, + "options" : { + "quest" : { + "missionType" : "Resources", + "resources" : { + "crystal" : 50, + "gems" : 60, + "gold" : 70, + "mercury" : 20, + "ore" : 30, + "sulfur" : 40, + "wood" : 10 + } + }, + "reward" : { + "secondarySkill.necromancy" : 3 + } + } + }, + "seerHut_257" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 28, + "y" : 86, + "options" : { + "quest" : { + "hero" : "catherine", + "missionType" : "Hero" + }, + "reward" : { + "artifact.angelicAlliance" : 1 + } + } + }, + "seerHut_258" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 31, + "y" : 86, + "options" : { + "quest" : { + "missionType" : "Player", + "player" : "purple" + }, + "reward" : { + "spell.fly" : 1 + } + } + }, + "seerHut_259" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 34, + "y" : 86, + "options" : { + "quest" : { + "artifacts" : [ + "armorOfWonder", + "badgeOfCourage", + "birdOfPerception", + "angelWings", + "armsOfLegion", + "armageddonsBlade", + "angelicAlliance", + "armorOfTheDamned" + ], + "missionType" : "Artifact" + }, + "reward" : { + "creature.cyclopKing" : 777 + } + } + }, + "seerHut_260" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 37, + "y" : 86, + "options" : { + "quest" : { + "creatures" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "archer" + }, + { + "amount" : 1, + "type" : "marksman" + }, + { + "amount" : 1, + "type" : "griffin" + }, + { + "amount" : 1, + "type" : "royalGriffin" + }, + { + "amount" : 1, + "type" : "swordsman" + } + ], + "missionType" : "Army" + }, + "reward" : {} + } + }, + "sign_261" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 105, + "options" : { + "text" : "monster peasant: 777 don't grow, friendly, never flee, msg \"peasantmsg\", treasure resource: 99999 each, torso of legion" + } + }, + "monster_262" : { + "l" : 0, + "subtype" : "peasant", + "template" : { + "animation" : "AVWPEAS", + "editorAnimation" : "AVWPEAS", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "monster", + "x" : 3, + "y" : 105, + "options" : { + "amount" : 777, + "character" : "friendly", + "neverFlees" : true, + "noGrowing" : true, + "rewardArtifact" : "torsoOfLegion", + "rewardMessage" : "peasantmsg", + "rewardResources" : { + "crystal" : 99999, + "gems" : 99999, + "gold" : 99999, + "mercury" : 99999, + "ore" : 99999, + "sulfur" : 99999, + "wood" : 99999 + } + } + }, + "prison_263" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 13, + "options" : { + "type" : "valeska" + } + }, + "sign_264" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 13, + "options" : { + "text" : "default options" + } + }, + "prison_265" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 16, + "options" : { + "experience" : 99999999, + "name" : "Anul", + "patrolRadius" : 9, + "portrait" : "orrin", + "type" : "luna", + "female" : false + } + }, + "prison_266" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 19, + "options" : { + "secondarySkills" : { + "artillery" : "advanced", + "learning" : "expert", + "offence" : "basic", + "armorer" : "advanced", + "intelligence" : "expert", + "sorcery" : "basic", + "resistance" : "advanced", + "firstAid" : "expert" + }, + "type" : "orrin" + } + }, + "prison_267" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 22, + "options" : { + "artifacts" : { + "head" : "admiralsHat", + "leftHand" : "shieldOfTheDamned", + "rightHand" : "armageddonsBlade", + "shoulders" : "angelWings", + "spellbook" : "spellBook", + "torso" : "armorOfWonder" + }, + "type" : "edric" + } + }, + "prison_268" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 25, + "options" : { + "spellBook" : [ + "summonBoat", + "scuttleBoat", + "visions", + "viewEarth", + "disguise", + "viewAir", + "fly", + "waterWalk", + "dimensionDoor", + "townPortal", + "quicksand", + "landMine", + "forceField", + "fireWall", + "earthquake", + "magicArrow", + "iceBolt", + "lightningBolt", + "implosion", + "chainLightning", + "frostRing", + "fireball", + "inferno", + "meteorShower", + "deathRipple", + "destroyUndead", + "armageddon", + "shield", + "airShield", + "fireShield", + "protectAir", + "protectFire", + "protectWater", + "protectEarth", + "antiMagic", + "dispel", + "magicMirror", + "cure", + "resurrection", + "animateDead", + "sacrifice", + "bless", + "curse", + "bloodlust", + "precision", + "weakness", + "stoneSkin", + "disruptingRay", + "prayer", + "mirth", + "sorrow", + "fortune", + "misfortune", + "haste", + "slow", + "slayer", + "frenzy", + "counterstrike", + "berserk", + "hypnotize", + "forgetfulness", + "blind", + "teleport", + "removeObstacle", + "clone", + "fireElemental", + "earthElemental", + "waterElemental", + "airElemental" + ], + "type" : "sorsha" + } + }, + "sign_269" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 16, + "options" : { + "text" : "Elementalist, Luna, Anul, 99999999 exp, Orrin avatar, male, patrol 9 squares" + } + }, + "sign_270" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 19, + "options" : { + "text" : "secondary skills from end of list: Expert (first aid), Advanced, Basic (Offence), Expert, Advanced, Basic, Expert, Advanced" + } + }, + "sign_271" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 22, + "options" : { + "text" : "Arts: have spellbook, head: Admirals hat, shoulders: angel wings, right hand: armagedons blade; left hand: shield of damned; torso: armor of wonder" + } + }, + "sign_272" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 25, + "options" : { + "text" : "have all spells" + } + } +} \ No newline at end of file diff --git a/test/testdata/ObjectPropertyTest/objects.json b/test/testdata/ObjectPropertyTest/objects.json new file mode 100644 index 000000000..c68f1a99e --- /dev/null +++ b/test/testdata/ObjectPropertyTest/objects.json @@ -0,0 +1,7389 @@ +{ + "mine_0" : { + "l" : 0, + "subtype" : "alchemistLab", + "template" : { + "animation" : "AVMALCH0", + "editorAnimation" : "AVMALCH0", + "mask" : [ + "VVV", + "VVV", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 10, + "y" : 1, + "options" : { + "owner" : "red" + } + }, + "mine_1" : { + "l" : 0, + "subtype" : "crystalCavern", + "template" : { + "animation" : "AVMCRDR0", + "editorAnimation" : "AVMCRDR0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 14, + "y" : 1, + "options" : { + "owner" : "blue" + } + }, + "mine_2" : { + "l" : 0, + "subtype" : "gemPond", + "template" : { + "animation" : "AVMGEDR0", + "editorAnimation" : "AVMGEDR0", + "mask" : [ + "BBB", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ], + "zIndex" : 100 + }, + "type" : "mine", + "x" : 18, + "y" : 1, + "options" : { + "owner" : "tan" + } + }, + "mine_3" : { + "l" : 0, + "subtype" : "goldMine", + "template" : { + "animation" : "AVMGODR0", + "editorAnimation" : "AVMGODR0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 22, + "y" : 1, + "options" : { + "owner" : "green" + } + }, + "mine_4" : { + "l" : 0, + "subtype" : "orePit", + "template" : { + "animation" : "AVMORDR0", + "editorAnimation" : "AVMORDR0", + "mask" : [ + "BBB", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ], + "zIndex" : 100 + }, + "type" : "mine", + "x" : 26, + "y" : 1, + "options" : { + "owner" : "orange" + } + }, + "mine_5" : { + "l" : 0, + "subtype" : "sawmill", + "template" : { + "animation" : "AVMSAWD0", + "editorAnimation" : "AVMSAWD0", + "mask" : [ + "VVVVV", + "VVVBB", + "VBBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 31, + "y" : 1, + "options" : { + "owner" : "purple" + } + }, + "mine_6" : { + "l" : 0, + "subtype" : "sulfurDune", + "template" : { + "animation" : "AVMSULF0", + "editorAnimation" : "AVMSULF0", + "mask" : [ + "VVV", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 35, + "y" : 1, + "options" : { + "owner" : "teal" + } + }, + "mine_7" : { + "l" : 0, + "subtype" : "abandoned", + "template" : { + "animation" : "AVXABND0", + "editorAnimation" : "AVXABND0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 39, + "y" : 1, + "options" : { + "possibleResources" : [ + "mercury", + "ore", + "sulfur", + "crystal", + "gems", + "gold" + ] + } + }, + "mine_8" : { + "l" : 0, + "subtype" : "abandoned", + "template" : { + "animation" : "AVXABND0", + "editorAnimation" : "AVXABND0", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "mine", + "x" : 43, + "y" : 1, + "options" : { + "possibleResources" : [ + "mercury" + ] + } + }, + "sign_9" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 4, + "y" : 1 + }, + "sign_10" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 6, + "y" : 1, + "options" : { + "text" : "Previus one have random sign" + } + }, + "oceanBottle_11" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBTTL0", + "editorAnimation" : "AVXBTTL0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "oceanBottle", + "x" : 81, + "y" : 5 + }, + "oceanBottle_12" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBTTL0", + "editorAnimation" : "AVXBTTL0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "oceanBottle", + "x" : 83, + "y" : 5, + "options" : { + "text" : "Other one have random text" + } + }, + "boat_13" : { + "l" : 0, + "subtype" : "evil", + "template" : { + "animation" : "AVXBOAT0", + "editorAnimation" : "AVXBOAT0", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "boat", + "x" : 80, + "y" : 5 + }, + "creatureGeneratorCommon_14" : { + "l" : 0, + "subtype" : "guardhouse", + "template" : { + "animation" : "AVGPIKE0", + "editorAnimation" : "AVGPIKE0", + "mask" : [ + "VVV", + "VBV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "creatureGeneratorCommon", + "x" : 5, + "y" : 8 + }, + "creatureGeneratorCommon_15" : { + "l" : 0, + "subtype" : "archersTower", + "template" : { + "animation" : "AVGCROS0", + "editorAnimation" : "AVGCROS0", + "mask" : [ + "VVV", + "VVV", + "VAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "creatureGeneratorCommon", + "x" : 9, + "y" : 8, + "options" : { + "owner" : "red" + } + }, + "creatureGeneratorCommon_16" : { + "l" : 0, + "subtype" : "griffinTower", + "template" : { + "animation" : "AVGGRFF0", + "editorAnimation" : "AVGGRFF0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "creatureGeneratorCommon", + "x" : 13, + "y" : 8, + "options" : { + "owner" : "tan" + } + }, + "witchHut_17" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVSWTCH0", + "editorAnimation" : "AVSWTCH0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "witchHut", + "x" : 17, + "y" : 8, + "options" : { + "allowedSkills" : { + "anyOf" : [ + "airMagic" + ] + } + } + }, + "witchHut_18" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVSWTCH0", + "editorAnimation" : "AVSWTCH0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "witchHut", + "x" : 20, + "y" : 8, + "options" : { + "allowedSkills" : { + "anyOf" : [ + "airMagic", + "archery", + "armorer", + "artillery" + ] + } + } + }, + "witchHut_19" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVSWTCH0", + "editorAnimation" : "AVSWTCH0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "witchHut", + "x" : 23, + "y" : 8, + "options" : { + "allowedSkills" : { + "anyOf" : [ + "airMagic", + "archery", + "armorer", + "artillery", + "ballistics", + "diplomacy", + "eagleEye", + "earthMagic", + "estates", + "fireMagic", + "firstAid", + "intelligence", + "learning", + "logistics", + "luck", + "mysticism", + "navigation", + "offence", + "pathfinding", + "resistance", + "scholar", + "scouting", + "sorcery", + "tactics", + "waterMagic", + "wisdom" + ] + } + } + }, + "randomDwelling_20" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 5, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "sign_21" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 15, + "y" : 8, + "options" : { + "text" : "Air Magic" + } + }, + "sign_22" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 18, + "y" : 8, + "options" : { + "text" : "Air Magic, Archery, Armorer,Artillery" + } + }, + "sign_23" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 8, + "options" : { + "text" : "Any random skill exclude necromancy (default)" + } + }, + "sign_24" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 8, + "options" : { + "text" : "Not owned by anyone" + } + }, + "sign_25" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 7, + "y" : 8, + "options" : { + "text" : "Owned by red player" + } + }, + "sign_26" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 11, + "y" : 8, + "options" : { + "text" : "Owned by tan player" + } + }, + "sign_27" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 12, + "options" : { + "text" : "Default: not owned by anyone, level 1-7, all alignments" + } + }, + "sign_28" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 15, + "options" : { + "text" : "Owned by red, level 6-7, castle, dungeon or fortress" + } + }, + "randomDwelling_29" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 5, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_30" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 7, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_31" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 9, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_32" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 11, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_33" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 13, + "y" : 12, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "conflux", + "dungeon", + "fortress", + "inferno", + "necropolis", + "rampart", + "stronghold", + "tower" + ] + }, + "maxLevel" : 6 + } + }, + "randomDwelling_34" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 7, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_35" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 9, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_36" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 11, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "randomDwelling_37" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVRCGEN0", + "editorAnimation" : "AVRCGEN0", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwelling", + "x" : 13, + "y" : 15, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "castle", + "dungeon", + "fortress" + ] + }, + "maxLevel" : 6, + "minLevel" : 5, + "owner" : "red" + } + }, + "sign_38" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 18, + "options" : { + "text" : "Level 1 template! Owned by tan, rampart of conflux" + } + }, + "randomDwellingLvl_39" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 5, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_40" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 7, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_41" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 9, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_42" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 11, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingLvl_43" : { + "l" : 0, + "subtype" : "objectLvl1", + "template" : { + "animation" : "AVRCGEN1", + "editorAnimation" : "AVRCGEN1", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingLvl", + "x" : 13, + "y" : 18, + "options" : { + "allowedFactions" : { + "anyOf" : [ + "conflux", + "rampart" + ] + }, + "owner" : "tan" + } + }, + "randomDwellingFaction_44" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 5, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "sign_45" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 22, + "options" : { + "text" : "Conflux template! Owned by teal, level 3-6" + } + }, + "randomDwellingFaction_46" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 7, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "randomDwellingFaction_47" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 9, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "randomDwellingFaction_48" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 11, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "randomDwellingFaction_49" : { + "l" : 0, + "subtype" : "objectConflux", + "template" : { + "animation" : "AVRCGN08", + "editorAnimation" : "AVRCGN08", + "mask" : [ + "VVV", + "VBB", + "VAA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomDwellingFaction", + "x" : 13, + "y" : 22, + "options" : { + "maxLevel" : 5, + "minLevel" : 2, + "owner" : "teal" + } + }, + "shrineOfMagicLevel1_50" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL1SH0", + "editorAnimation" : "AVXL1SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel1", + "x" : 25, + "y" : 8 + }, + "sign_51" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 24, + "y" : 8, + "options" : { + "text" : "Random level 1 spell" + } + }, + "shrineOfMagicLevel1_52" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL1SH0", + "editorAnimation" : "AVXL1SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel1", + "x" : 28, + "y" : 8, + "options" : { + "spell" : "haste" + } + }, + "sign_53" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 27, + "y" : 8, + "options" : { + "text" : "Level 1 spell: Haste " + } + }, + "shrineOfMagicLevel2_54" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL2SH0", + "editorAnimation" : "AVXL2SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel2", + "x" : 31, + "y" : 8 + }, + "sign_55" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 30, + "y" : 8, + "options" : { + "text" : "Random level 2 spell" + } + }, + "sign_56" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 33, + "y" : 8, + "options" : { + "text" : "Level 2 spell: Quicksand" + } + }, + "shrineOfMagicLevel2_57" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL2SH0", + "editorAnimation" : "AVXL2SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel2", + "x" : 34, + "y" : 8, + "options" : { + "spell" : "quicksand" + } + }, + "shrineOfMagicLevel3_58" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL3SH0", + "editorAnimation" : "AVXL3SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel3", + "x" : 37, + "y" : 8 + }, + "shrineOfMagicLevel3_59" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXL3SH0", + "editorAnimation" : "AVXL3SH0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shrineOfMagicLevel3", + "x" : 40, + "y" : 8, + "options" : { + "spell" : "teleport" + } + }, + "sign_60" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 36, + "y" : 8, + "options" : { + "text" : "Random level 3 spell" + } + }, + "sign_61" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 39, + "y" : 8, + "options" : { + "text" : "Level 3 spell: teleport" + } + }, + "lighthouse_62" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXLTHS0", + "editorAnimation" : "AVXLTHS0", + "mask" : [ + "VVV", + "VVV", + "VVV", + "VVA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "lighthouse", + "x" : 43, + "y" : 8, + "options" : { + "owner" : "green" + } + }, + "sign_63" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 42, + "y" : 8, + "options" : { + "text" : "Owned by green player" + } + }, + "garrisonHorizontal_64" : { + "l" : 0, + "subtype" : "normal", + "template" : { + "animation" : "AVCGAR10", + "editorAnimation" : "AVCGAR10", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 48, + "y" : 8, + "options" : { + "owner" : "blue", + "removableUnits" : true + } + }, + "sign_65" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 45, + "y" : 8, + "options" : { + "text" : "Owned by blue player and troops are removable (default)" + } + }, + "garrisonHorizontal_66" : { + "l" : 0, + "subtype" : "normal", + "template" : { + "animation" : "AVCGAR10", + "editorAnimation" : "AVCGAR10", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 53, + "y" : 8, + "options" : { + "owner" : "blue" + } + }, + "sign_67" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 50, + "y" : 8, + "options" : { + "text" : "Owned by blue player and troops are NOT removable" + } + }, + "garrisonHorizontal_68" : { + "l" : 0, + "subtype" : "antiMagic", + "template" : { + "animation" : "AVCGAR20", + "editorAnimation" : "AVCGAR20", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 58, + "y" : 8, + "options" : { + "army" : [ + { + "amount" : 100, + "type" : "enchanter" + }, + {}, + {}, + {}, + { + "amount" : 10, + "type" : "azureDragon" + }, + {}, + {} + ], + "owner" : "red" + } + }, + "sign_69" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 55, + "y" : 8, + "options" : { + "text" : "Owned by red player, troops are NOT removable and contain following troops: slot 1 - 100 enchanters, slot 5 - 10 azure dragons" + } + }, + "garrisonHorizontal_70" : { + "l" : 0, + "subtype" : "antiMagic", + "template" : { + "animation" : "AVCGAR20", + "editorAnimation" : "AVCGAR20", + "mask" : [ + "VVVV", + "VBAB" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "garrisonHorizontal", + "x" : 63, + "y" : 8, + "options" : { + "army" : [ + { + "amount" : 11, + "type" : "gremlin" + }, + { + "amount" : 12, + "type" : "masterGremlin" + }, + { + "amount" : 13, + "type" : "stoneGargoyle" + }, + { + "amount" : 14, + "type" : "obsidianGargoyle" + }, + { + "amount" : 15, + "type" : "ironGolem" + }, + { + "amount" : 16, + "type" : "stoneGolem" + }, + { + "amount" : 17, + "type" : "mage" + } + ] + } + }, + "sign_71" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 60, + "y" : 8, + "options" : { + "text" : "NOT owned by anyone, troops are removable and contain following troops: slot 1 - 11 gremlins, slot 2 - 12 master gremlins, slot 3 - 13 stone garg, etc" + } + }, + "scholar_72" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 66, + "y" : 8 + }, + "scholar_73" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 69, + "y" : 8, + "options" : { + "rewardPrimSkill" : "attack" + } + }, + "scholar_74" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 72, + "y" : 8, + "options" : { + "rewardPrimSkill" : "defence" + } + }, + "shipyard_75" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSHYD0", + "editorAnimation" : "AVXSHYD0", + "mask" : [ + "VVV", + "VVV", + "BAB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "shipyard", + "x" : 81, + "y" : 12, + "options" : { + "owner" : "pink" + } + }, + "sign_76" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 78, + "y" : 12, + "options" : { + "text" : "Owned by pink player" + } + }, + "sign_77" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 65, + "y" : 8, + "options" : { + "text" : "Random reward" + } + }, + "sign_78" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 68, + "y" : 8, + "options" : { + "text" : "Primary skill: attack" + } + }, + "sign_79" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 71, + "y" : 8, + "options" : { + "text" : "Primary skill: defense" + } + }, + "sign_80" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 74, + "y" : 8, + "options" : { + "text" : "Primary skill: spell power" + } + }, + "sign_81" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 77, + "y" : 8, + "options" : { + "text" : "Primary skill: knowledge" + } + }, + "scholar_82" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 75, + "y" : 8, + "options" : { + "rewardPrimSkill" : "spellpower" + } + }, + "scholar_83" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 78, + "y" : 8, + "options" : { + "rewardPrimSkill" : "knowledge" + } + }, + "scholar_84" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 66, + "y" : 10, + "options" : { + "rewardSkill" : "sorcery" + } + }, + "sign_85" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 65, + "y" : 10, + "options" : { + "text" : "Secondary skill: sorcery" + } + }, + "sign_86" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 68, + "y" : 10, + "options" : { + "text" : "Secondary skill: first aid" + } + }, + "scholar_87" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 69, + "y" : 10, + "options" : { + "rewardSkill" : "firstAid" + } + }, + "sign_88" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 71, + "y" : 10, + "options" : { + "text" : "Spell: stone skin" + } + }, + "scholar_89" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 72, + "y" : 10, + "options" : { + "rewardSpell" : "stoneSkin" + } + }, + "scholar_90" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSCHL0", + "editorAnimation" : "AVXSCHL0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "scholar", + "x" : 75, + "y" : 10, + "options" : { + "rewardSpell" : "fly" + } + }, + "sign_91" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 74, + "y" : 10, + "options" : { + "text" : "Spell: fly" + } + }, + "sign_92" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 59, + "y" : 20, + "options" : { + "text" : "EVENT TESTING ZONE" + } + }, + "sign_93" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 61, + "y" : 18, + "options" : { + "text" : "Message: test. All players. Computer players can trigger" + } + }, + "sign_94" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 65, + "y" : 18, + "options" : { + "text" : "Message: lol, computers CANT trigger, disappear after visit, players 1,3,5 creatures: archer, basilik, pegasus (1 of each)" + } + }, + "sign_95" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 69, + "y" : 18, + "options" : { + "text" : "all non default: messagenondefault, players 1,8; allow comp trigger; don't cancel; guardians, pikeman, halberdman, etc; take -777 spell points" + } + }, + "sign_96" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 73, + "y" : 18, + "options" : { + "text" : "All pos: 99 999 999 exp, 999 spell points, morale\/luck +3, res 9,8,7,6,5,4,3;pskills: 1,2,3,4; sskill: adv. offence; art: rib cage, sp: blind, 1 troll" + } + }, + "event_97" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 62, + "y" : 18, + "options" : { + "aIActivable" : true, + "guardMessage" : "test", + "removeAfterVisit" : true + } + }, + "event_98" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 66, + "y" : 18, + "options" : { + "availableFor" : [ + "red", + "tan", + "orange" + ], + "guards" : [ + { + "amount" : 1, + "type" : "archer" + }, + { + "amount" : 1, + "type" : "basilisk" + }, + { + "amount" : 1, + "type" : "pegasus" + }, + {}, + {}, + {}, + {} + ], + "removeAfterVisit" : true + } + }, + "event_99" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 74, + "y" : 18, + "options" : { + "artifacts" : [ + "ribCage" + ], + "creatures" : [ + { + "amount" : 1, + "type" : "troll" + } + ], + "experience" : 99999999, + "luck" : 3, + "mana" : 999, + "morale" : 3, + "primarySkills" : { + "attack" : 1, + "defence" : 2, + "knowledge" : 4, + "spellpower" : 3 + }, + "removeAfterVisit" : true, + "resources" : { + "crystal" : 5, + "gems" : 4, + "gold" : 3, + "mercury" : 8, + "ore" : 7, + "sulfur" : 6, + "wood" : 9 + }, + "secondarySkills" : { + "offence" : "advanced" + }, + "spells" : [ + "blind" + ] + } + }, + "event_100" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 70, + "y" : 18, + "options" : { + "aIActivable" : true, + "availableFor" : [ + "red", + "pink" + ], + "guardMessage" : "messagenondefault", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "pikeman" + } + ], + "mana" : -777 + } + }, + "hero_101" : { + "l" : 0, + "subtype" : "cleric", + "template" : { + "animation" : "AH01_E", + "editorAnimation" : "AH01_E", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "hero", + "x" : 2, + "y" : 1, + "options" : { + "army" : [ + { + "amount" : 1, + "type" : "crystalDragon" + }, + { + "amount" : 1, + "type" : "fairieDragon" + }, + { + "amount" : 1, + "type" : "rustDragon" + }, + { + "amount" : 1, + "type" : "azureDragon" + }, + {}, + {}, + {} + ], + "artifacts" : { + "feet" : "bootsOfLevitation", + "spellbook" : "spellBook" + }, + "biography" : "321", + "owner" : "red", + "primarySkills" : { + "attack" : 55, + "defence" : 44, + "knowledge" : 22, + "spellpower" : 33 + }, + "secondarySkills" : { + "wisdom" : "expert", + "sorcery" : "expert" + }, + "spellBook" : [ + "fly" + ], + "tightFormation" : true, + "type" : "ingham" + } + }, + "sign_102" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 0, + "y" : 1, + "options" : { + "text" : "Hero: Ingham, bio:321,prim skills:55,44,33,22,spells:fly,arts:spellbook,boots of levithation,creatures:4 dragons,grouped,s skills:wisdom,sorcery exper" + } + }, + "randomHero_103" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 124, + "y" : 143, + "options" : { + "owner" : "tan" + } + }, + "randomHero_104" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 119, + "y" : 143, + "options" : { + "owner" : "blue" + } + }, + "randomHero_105" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 129, + "y" : 143, + "options" : { + "owner" : "green" + } + }, + "randomHero_106" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 134, + "y" : 143, + "options" : { + "owner" : "orange" + } + }, + "randomHero_107" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 139, + "y" : 143, + "options" : { + "owner" : "purple" + } + }, + "randomHero_108" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 144, + "y" : 143, + "options" : { + "owner" : "teal" + } + }, + "randomHero_109" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AHRANDOM", + "editorAnimation" : "AHRANDOM", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomHero", + "x" : 114, + "y" : 143, + "options" : { + "owner" : "pink" + } + }, + "event_110" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 78, + "y" : 18, + "options" : { + "removeAfterVisit" : true + } + }, + "event_111" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 82, + "y" : 18, + "options" : { + "artifacts" : [ + "admiralsHat", + "ambassadorsSash", + "amuletOfTheUndertaker", + "angelFeatherArrows", + "angelWings", + "angelicAlliance", + "angelicAlliance", + "armageddonsBlade", + "armorOfTheDamned", + "armorOfWonder", + "badgeOfCourage", + "birdOfPerception", + "blackshardOfTheDeadKnight", + "bootsOfLevitation", + "bootsOfPolarity", + "bootsOfSpeed", + "bowOfElvenCherrywood", + "bowOfTheSharpshooter", + "bowstringOfTheUnicornsMane", + "breastplateOfBrimstone", + "breastplateOfPetrifiedWood", + "bucklerOfTheGnollKing", + "capeOfVelocity", + "cardsOfProphecy", + "celestialNecklaceOfBliss", + "centaurAxe", + "charmOfMana", + "cloakOfTheUndeadKing", + "cloverOfFortune", + "collarOfConjuring", + "cornucopia", + "crestOfValor", + "capeOfConjuring", + "crownOfDragontooth", + "crownOfTheSupremeMagi", + "deadMansBoots", + "diplomatsRing", + "dragonScaleArmor", + "dragonScaleShield", + "dragonWingTabard", + "dragonboneGreaves", + "elixirOfLife", + "emblemOfCognizance", + "endlessPurseOfGold", + "endlessSackOfGold", + "endlessBagOfGold", + "equestriansGloves", + "everflowingCrystalCloak", + "everpouringVialOfMercury", + "eversmokingRingOfSulfur", + "garnitureOfInterference", + "glyphOfGallantry", + "goldenBow", + "greaterGnollsFlail", + "headOfLegion", + "hellstormHelmet", + "hellstormHelmet", + "helmOfChaos", + "helmOfHeavenlyEnlightenment", + "helmOfTheAlabasterUnicorn", + "helmOfTheAlabasterUnicorn", + "hourglassOfTheEvilHour", + "inexhaustibleCartOfLumber", + "inexhaustibleCartOfOre" + ], + "removeAfterVisit" : true + } + }, + "event_112" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 86, + "y" : 18, + "options" : { + "removeAfterVisit" : true, + "spells" : [ + "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", + "protectEarth", + "protectWater", + "protectAir", + "protectFire", + "quicksand", + "removeObstacle", + "resurrection", + "sacrifice", + "scuttleBoat", + "shield", + "slayer", + "slow", + "sorrow", + "stoneSkin", + "summonBoat", + "teleport", + "townPortal", + "viewAir", + "viewEarth", + "visions", + "waterElemental", + "waterWalk", + "weakness" + ] + } + }, + "event_113" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 90, + "y" : 18, + "options" : { + "creatures" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "pikeman" + } + ], + "removeAfterVisit" : true + } + }, + "event_114" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVZEVNT0", + "editorAnimation" : "AVZEVNT0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "event", + "x" : 94, + "y" : 18, + "options" : { + "creatures" : [ + { + "amount" : 9999, + "type" : "rustDragon" + }, + { + "amount" : 9999, + "type" : "fairieDragon" + }, + { + "amount" : 9999, + "type" : "crystalDragon" + }, + { + "amount" : 9999, + "type" : "azureDragon" + }, + { + "amount" : 9999, + "type" : "enchanter" + }, + { + "amount" : 9999, + "type" : "diamondGolem" + }, + { + "amount" : 9999, + "type" : "troll" + } + ], + "removeAfterVisit" : true + } + }, + "sign_115" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 77, + "y" : 18, + "options" : { + "text" : "give 30 wizard well's" + } + }, + "sign_116" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 81, + "y" : 18, + "options" : { + "text" : "Give 64 first artifacts up to Inexhaustible card of Ore" + } + }, + "sign_117" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 85, + "y" : 18, + "options" : { + "text" : "gives all possible spells" + } + }, + "sign_118" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 89, + "y" : 18, + "options" : { + "text" : "Give 7 stacks of 1 pikeman" + } + }, + "sign_119" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 93, + "y" : 18, + "options" : { + "text" : "Give 9999 of each last creature in list: Rust, Faerie, Azure, Crystal dragons, Enchanters, Diamond Golems, Trolls" + } + }, + "sign_120" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 32, + "options" : { + "text" : "Resource template: default" + } + }, + "randomResource_121" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 4, + "y" : 32 + }, + "randomResource_122" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 5, + "y" : 32 + }, + "randomResource_123" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 6, + "y" : 32 + }, + "randomResource_124" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 7, + "y" : 32 + }, + "randomResource_125" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 8, + "y" : 32 + }, + "sign_126" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 34, + "options" : { + "text" : "Resource template: amount 150" + } + }, + "randomResource_127" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 4, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_128" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 5, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_129" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 6, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_130" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 7, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "randomResource_131" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 8, + "y" : 34, + "options" : { + "amount" : 150 + } + }, + "sign_132" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 36, + "options" : { + "text" : "Resource template: amount 255, message:testresource, creatures: pikeman, halberdier, archer (slots and amount 1,2,3) and 15 fairie dragons (slot 7)" + } + }, + "randomResource_133" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 4, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_134" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 5, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_135" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 6, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_136" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 7, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "randomResource_137" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVTRNDM0", + "editorAnimation" : "AVTRNDM0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomResource", + "x" : 8, + "y" : 36, + "options" : { + "amount" : 255, + "guardMessage" : "testresource", + "guards" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 2, + "type" : "halberdier" + }, + { + "amount" : 3, + "type" : "archer" + }, + {}, + {}, + {}, + { + "amount" : 15, + "type" : "fairieDragon" + } + ] + } + }, + "resource_138" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 38 + }, + "sign_139" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 38, + "options" : { + "text" : "Resource crystal: default" + } + }, + "sign_140" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 40, + "options" : { + "text" : "Resource crystal: default, amount 400" + } + }, + "resource_141" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 40, + "options" : { + "amount" : 400 + } + }, + "sign_142" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 42, + "options" : { + "text" : "Resource crystal: default, amount 500, message: crystalalot" + } + }, + "resource_143" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 42, + "options" : { + "amount" : 500, + "guardMessage" : "crystalalot" + } + }, + "sign_144" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 44, + "options" : { + "text" : "Resource crystal: default, amount 600, message: crystalguard, creatures: 100 rust dragons (slot 1)" + } + }, + "resource_145" : { + "l" : 0, + "subtype" : "crystal", + "template" : { + "animation" : "AVTCRYS0", + "editorAnimation" : "AVTCRYS0", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "resource", + "x" : 4, + "y" : 44, + "options" : { + "amount" : 600, + "guardMessage" : "crystalguard", + "guards" : [ + { + "amount" : 100, + "type" : "rustDragon" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "sign_146" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 46, + "options" : { + "text" : "Spell scroll: default (always magic arrow?)" + } + }, + "spellScroll_147" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0001", + "editorAnimation" : "AVA0001", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "spellScroll", + "x" : 4, + "y" : 46, + "options" : { + "spell" : "magicArrow" + } + }, + "sign_148" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 48, + "options" : { + "text" : "Spell scroll: spell prayer, message \"prayerspell\"" + } + }, + "spellScroll_149" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0001", + "editorAnimation" : "AVA0001", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "spellScroll", + "x" : 4, + "y" : 48, + "options" : { + "guardMessage" : "prayerspell", + "spell" : "prayer" + } + }, + "sign_150" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 50, + "options" : { + "text" : "Spell scroll: spell inferno, message \"infernospell\", creatures: slot 6 - 666 devils" + } + }, + "spellScroll_151" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0001", + "editorAnimation" : "AVA0001", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "spellScroll", + "x" : 4, + "y" : 50, + "options" : { + "guardMessage" : "infernospell", + "guards" : [ + {}, + {}, + {}, + {}, + {}, + { + "amount" : 666, + "type" : "devil" + }, + {} + ], + "spell" : "inferno" + } + }, + "artifact_152" : { + "l" : 0, + "subtype" : "centaurAxe", + "template" : { + "animation" : "AVA0007", + "editorAnimation" : "AVA0007", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "artifact", + "x" : 4, + "y" : 52 + }, + "sign_153" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 52, + "options" : { + "text" : "Artifact centaurs axe: default" + } + }, + "sign_154" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 54, + "options" : { + "text" : "Artifact centaurs axe: message longtext" + } + }, + "artifact_155" : { + "l" : 0, + "subtype" : "centaurAxe", + "template" : { + "animation" : "AVA0007", + "editorAnimation" : "AVA0007", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "artifact", + "x" : 4, + "y" : 54, + "options" : { + "guardMessage" : "longtext" + } + }, + "sign_156" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 56, + "options" : { + "text" : "Artifact centaurs axe: message trolled, creatures: slot 3 - 44 trolls" + } + }, + "artifact_157" : { + "l" : 0, + "subtype" : "centaurAxe", + "template" : { + "animation" : "AVA0007", + "editorAnimation" : "AVA0007", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "artifact", + "x" : 4, + "y" : 56, + "options" : { + "guardMessage" : "trolled", + "guards" : [ + {}, + {}, + { + "amount" : 44, + "type" : "troll" + }, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_158" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 4, + "y" : 58 + }, + "sign_159" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 58, + "options" : { + "text" : "Artifact template: default" + } + }, + "randomArtifact_160" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 5, + "y" : 58 + }, + "randomArtifact_161" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 6, + "y" : 58 + }, + "randomArtifact_162" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 7, + "y" : 58 + }, + "randomArtifact_163" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 8, + "y" : 58 + }, + "sign_164" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 60, + "options" : { + "text" : "Artifact template: message \"artifactdefault\", creatures slot 1 -: 500 mages" + } + }, + "randomArtifact_165" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 4, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_166" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 5, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_167" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 6, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_168" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 7, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifact_169" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARAND", + "editorAnimation" : "AVARAND", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifact", + "x" : 8, + "y" : 60, + "options" : { + "guardMessage" : "artifactdefault", + "guards" : [ + { + "amount" : 500, + "type" : "mage" + }, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + }, + "randomArtifactMajor_170" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 4, + "y" : 62 + }, + "sign_171" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 62, + "options" : { + "text" : "Artifact template 3: default" + } + }, + "randomArtifactMajor_172" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 5, + "y" : 62 + }, + "randomArtifactMajor_173" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 6, + "y" : 62 + }, + "randomArtifactMajor_174" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 8, + "y" : 62 + }, + "randomArtifactMajor_175" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 7, + "y" : 62 + }, + "sign_176" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 64, + "options" : { + "text" : "Artifact template 3: message \"artifactthree\", creatures: slot 3 - 333 of royal griffins" + } + }, + "randomArtifactMajor_177" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVARND3", + "editorAnimation" : "AVARND3", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomArtifactMajor", + "x" : 4, + "y" : 64, + "options" : { + "guardMessage" : "artifactthree", + "guards" : [ + {}, + {}, + { + "amount" : 333, + "type" : "royalGriffin" + }, + {}, + {}, + {}, + {} + ] + } + }, + "pandoraBox_178" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 66 + }, + "sign_179" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 66, + "options" : { + "text" : "Pandora box: default" + } + }, + "sign_180" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 68, + "options" : { + "text" : "Pandora box: message \"giveexp\", creatures: slot 5 - 5 pixies, take mana points -555" + } + }, + "pandoraBox_181" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 68, + "options" : { + "guardMessage" : "giveexp", + "guards" : [ + {}, + {}, + {}, + {}, + { + "amount" : 5, + "type" : "pixie" + }, + {}, + {} + ], + "mana" : -555 + } + }, + "sign_182" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 70, + "options" : { + "text" : "Pandora box: 1000exp, give 100 mana points, +3 morale, +2 luck, resource + 9,8,7,6,5,4, primary skills +9,8,7,6" + } + }, + "pandoraBox_183" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 70, + "options" : { + "experience" : 1000, + "luck" : 2, + "mana" : 100, + "morale" : 3, + "primarySkills" : { + "attack" : 9, + "defence" : 8, + "knowledge" : 6, + "spellpower" : 7 + }, + "resources" : { + "crystal" : 6, + "gems" : 5, + "gold" : 4, + "mercury" : 9, + "ore" : 8, + "sulfur" : 7, + "wood" : 10 + } + } + }, + "sign_184" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 72, + "options" : { + "text" : "Pandora box: secondar skills: expert pathfinding, advanced wisdom, basic necromancy, expert armorer" + } + }, + "pandoraBox_185" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 72, + "options" : { + "secondarySkills" : { + "pathfinding" : "expert", + "wisdom" : "advanced", + "necromancy" : "basic", + "armorer" : "expert" + } + } + }, + "sign_186" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 3, + "y" : 74, + "options" : { + "text" : "Pandora box: artifacts: angel winge, helm of chaos, wizards well, spells: armageddon, water elemental; creatures: 111 crusader, 100 rogues" + } + }, + "pandoraBox_187" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVA0128", + "editorAnimation" : "AVA0128", + "mask" : [ + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "pandoraBox", + "x" : 4, + "y" : 74, + "options" : { + "artifacts" : [ + "angelWings", + "helmOfChaos", + "wizardsWell" + ], + "creatures" : [ + { + "amount" : 111, + "type" : "crusader" + }, + { + "amount" : 100, + "type" : "rogue" + } + ], + "spells" : [ + "armageddon", + "waterElemental" + ] + } + }, + "town_188" : { + "l" : 0, + "subtype" : "castle", + "template" : { + "animation" : "AVCCASX0", + "editorAnimation" : "AVCCASX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "town", + "x" : 26, + "y" : 14, + "options" : { + "army" : [ + { + "amount" : 7, + "type" : "pikeman" + }, + { + "amount" : 6, + "type" : "archer" + }, + { + "amount" : 5, + "type" : "griffin" + }, + { + "amount" : 4, + "type" : "swordsman" + }, + { + "amount" : 3, + "type" : "monk" + }, + { + "amount" : 2, + "type" : "cavalier" + }, + { + "amount" : 1, + "type" : "angel" + } + ], + "buildings" : {}, + "hasFort" : false, + "spells" : {}, + "tightFormation" : true + } + }, + "sign_189" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 14, + "options" : { + "text" : "Don't owned by anyone, dont have fort, non-upgraded creatures: 7,6,5,4,3,2,1" + } + }, + "randomTown_190" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVCRANX0", + "editorAnimation" : "AVCRANX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomTown", + "x" : 26, + "y" : 21, + "options" : { + "buildings" : { + "allOf" : [ + "blacksmith", + "capitol", + "castle", + "citadel", + "cityHall", + "dwellingLvl1", + "dwellingLvl2", + "dwellingLvl3", + "dwellingLvl4", + "dwellingLvl5", + "dwellingLvl6", + "dwellingLvl7", + "dwellingUpLvl1", + "dwellingUpLvl2", + "dwellingUpLvl3", + "dwellingUpLvl4", + "dwellingUpLvl5", + "dwellingUpLvl6", + "dwellingUpLvl7", + "fort", + "grail", + "horde1", + "horde2", + "horde3", + "horde4", + "horde5", + "mageGuild1", + "mageGuild2", + "mageGuild3", + "mageGuild4", + "mageGuild5", + "marketplace", + "resourceSilo", + "shipyard", + "tavern", + "townHall" + ] + }, + "name" : "TownAsRed", + "spells" : {} + } + }, + "sign_191" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 21, + "options" : { + "text" : "Same as red player, name \"TownAsRed\". everything built" + } + }, + "randomTown_192" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVCRANX0", + "editorAnimation" : "AVCRANX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomTown", + "x" : 26, + "y" : 27, + "options" : { + "buildings" : {}, + "hasFort" : false, + "spells" : {} + } + }, + "sign_193" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 27, + "options" : { + "text" : "Don't have fort, one timed evernt on day 3, every 3 days" + } + }, + "randomTown_194" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVCRANX0", + "editorAnimation" : "AVCRANX0", + "mask" : [ + "VVVVVV", + "VVVVVV", + "VVVVVV", + "VVBBBV", + "VBBBBB", + "VBBABB" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "randomTown", + "x" : 26, + "y" : 32, + "options" : { + "buildings" : { + "allOf" : [ + "grail" + ], + "noneOf" : [ + "blacksmith", + "dwellingLvl1", + "dwellingLvl2", + "dwellingLvl3", + "dwellingLvl4", + "dwellingLvl5", + "dwellingLvl6", + "dwellingLvl7", + "fort", + "mageGuild1", + "marketplace", + "shipyard", + "tavern", + "townHall" + ] + }, + "spells" : {} + } + }, + "sign_195" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 32, + "options" : { + "text" : "Don't have fort, all buildings blocked, grail built" + } + }, + "seerHut_196" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 4, + "y" : 83, + "options" : { + "quest" : {}, + "reward" : {} + } + }, + "sign_197" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 83, + "options" : { + "text" : "Default quest objects: empty" + } + }, + "sign_198" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 86, + "options" : { + "text" : "Require red player, deadline 1 month, reward 999 diamond golems, messages: text1one, text2two, text3three" + } + }, + "seerHut_199" : { + "l" : 0, + "subtype" : "0", + "template" : { + "animation" : "AVXSEER0", + "editorAnimation" : "AVXSEER0", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 6, + "y" : 83, + "options" : { + "quest" : {}, + "reward" : {} + } + }, + "seerHut_200" : { + "l" : 0, + "subtype" : "1", + "template" : { + "animation" : "AVXSEEY0", + "editorAnimation" : "AVXSEEY0", + "mask" : [ + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 8, + "y" : 83, + "options" : { + "quest" : {}, + "reward" : {} + } + }, + "seerHut_201" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 4, + "y" : 86, + "options" : { + "quest" : { + "completedText" : "text3three", + "firstVisitText" : "text1one", + "missionType" : "Player", + "nextVisitText" : "text2two", + "player" : "red", + "timeLimit" : 28 + }, + "reward" : { + "creature.diamondGolem" : 999 + } + } + }, + "questGuard_202" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 19, + "y" : 83, + "options" : { + "quest" : {} + } + }, + "questGuard_203" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 22, + "y" : 83, + "options" : { + "quest" : { + "missionType" : "Resources", + "resources" : { + "crystal" : 5, + "gems" : 6, + "gold" : 7, + "mercury" : 2, + "ore" : 3, + "sulfur" : 4, + "wood" : 1 + }, + "timeLimit" : 56 + } + } + }, + "questGuard_204" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 25, + "y" : 83, + "options" : { + "quest" : { + "completedText" : "testextthree", + "firstVisitText" : "testextone", + "missionType" : "PrimaryStat", + "nextVisitText" : "testexttwo", + "primarySkills" : { + "attack" : 5, + "defence" : 6, + "knowledge" : 8, + "spellpower" : 7 + } + } + } + }, + "questGuard_205" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 28, + "y" : 83, + "options" : { + "quest" : { + "heroLevel" : 4, + "missionType" : "Level", + "timeLimit" : 4 + } + } + }, + "sign_206" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 18, + "y" : 83, + "options" : { + "text" : "Quest guard: empty default" + } + }, + "sign_207" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 21, + "y" : 83, + "options" : { + "text" : "Quest guard: require 1,2,3,4,5,6,7 resources, deadline 3 months, " + } + }, + "sign_208" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 24, + "y" : 83, + "options" : { + "text" : "Quest guard: require skill 5,6,7,8; Texts: testextone, testexttwo, testextthree" + } + }, + "sign_209" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 27, + "y" : 83, + "options" : { + "text" : "Quest guard: require level 4, deadline 5 days" + } + }, + "sign_210" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 30, + "y" : 83, + "options" : { + "text" : "Quest guard: defeat specific hero: Orrin" + } + }, + "questGuard_211" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 31, + "y" : 83, + "options" : { + "quest" : { + "killTarget" : "prison_266", + "missionType" : "KillHero" + } + } + }, + "sign_212" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 33, + "y" : 83, + "options" : { + "text" : "Quest guard: defeat specific monster: Pikeman above" + } + }, + "questGuard_213" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 34, + "y" : 83, + "options" : { + "quest" : { + "killTarget" : "monster_214", + "missionType" : "KillCreature" + } + } + }, + "monster_214" : { + "l" : 0, + "subtype" : "pikeman", + "template" : { + "animation" : "AVWPIKE", + "editorAnimation" : "AVWPIKE", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "monster", + "x" : 34, + "y" : 81, + "options" : { + "character" : "aggressive" + } + }, + "sign_215" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 36, + "y" : 83, + "options" : { + "text" : "Quest guard: return with specific artifact: diplomat's ring" + } + }, + "questGuard_216" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 37, + "y" : 83, + "options" : { + "quest" : { + "artifacts" : [ + "diplomatsRing" + ], + "missionType" : "Artifact" + } + } + }, + "sign_217" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 39, + "y" : 83, + "options" : { + "text" : "Quest guard: return with specific creature: 1 azure dragon" + } + }, + "questGuard_218" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 40, + "y" : 83, + "options" : { + "quest" : { + "creatures" : [ + { + "amount" : 1, + "type" : "azureDragon" + } + ], + "missionType" : "Army" + } + } + }, + "sign_219" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 42, + "y" : 83, + "options" : { + "text" : "Quest guard: be specific hero: Wizard, Solmyr" + } + }, + "questGuard_220" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 43, + "y" : 83, + "options" : { + "quest" : { + "hero" : "solmyr", + "missionType" : "Hero" + } + } + }, + "sign_221" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 42, + "y" : 85, + "options" : { + "text" : "Quest guard: belong to player: teal" + } + }, + "questGuard_222" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXBOR80", + "editorAnimation" : "AVXBOR80", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "questGuard", + "x" : 43, + "y" : 85, + "options" : { + "quest" : { + "missionType" : "Player", + "player" : "teal" + } + } + }, + "randomMonster_223" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 89, + "options" : { + "character" : "aggressive" + } + }, + "sign_224" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 89, + "options" : { + "text" : "monster template: default" + } + }, + "sign_225" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 91, + "options" : { + "text" : "monster template: custom amount 543" + } + }, + "randomMonster_226" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 91, + "options" : { + "amount" : 543, + "character" : "aggressive" + } + }, + "sign_227" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 93, + "options" : { + "text" : "monster template: custom amount 432, don't grow, savage, never flees, message: savagemonster" + } + }, + "sign_228" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 95, + "options" : { + "text" : "monster template: treasure resources: 1,2,3,4,5,6,7 and artifact: diplomat's ring" + } + }, + "sign_229" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 97, + "options" : { + "text" : "monster template: treasure artifact: angel wings" + } + }, + "sign_230" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 99, + "options" : { + "text" : "monster template: message: treasureresources; treature resources: wood 10, gold 1000" + } + }, + "sign_231" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 101, + "options" : { + "text" : "monster template all non-default options: quanlity don't grow 1, complaint, never flees, msg test123, resource treasure: 7,6,5,4,3,2,1, art: spyglass" + } + }, + "randomMonster_232" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 95, + "options" : { + "character" : "aggressive", + "rewardArtifact" : "diplomatsRing", + "rewardResources" : { + "crystal" : 5, + "gems" : 6, + "gold" : 7, + "mercury" : 2, + "ore" : 3, + "sulfur" : 4, + "wood" : 1 + } + } + }, + "randomMonster_233" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 97, + "options" : { + "character" : "aggressive", + "rewardArtifact" : "angelWings" + } + }, + "randomMonster_234" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 99, + "options" : { + "character" : "aggressive", + "neverFlees" : true, + "rewardMessage" : "treasureresources", + "rewardResources" : { + "gold" : 1000, + "wood" : 10 + } + } + }, + "randomMonster_235" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 101, + "options" : { + "amount" : 1, + "character" : "compliant", + "neverFlees" : true, + "noGrowing" : true, + "rewardArtifact" : "spyglass", + "rewardMessage" : "test123", + "rewardResources" : { + "crystal" : 3, + "gems" : 2, + "gold" : 1, + "mercury" : 6, + "ore" : 5, + "sulfur" : 4, + "wood" : 7 + } + } + }, + "randomMonster_236" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMRND0", + "editorAnimation" : "AVWMRND0", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonster", + "x" : 3, + "y" : 93, + "options" : { + "amount" : 432, + "character" : "savage", + "neverFlees" : true, + "noGrowing" : true, + "rewardMessage" : "savagemonster" + } + }, + "sign_237" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 103, + "options" : { + "text" : "monster lvl 7 template: random quanlity don't grow, hostile, never flees" + } + }, + "randomMonsterLevel7_238" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVWMON7", + "editorAnimation" : "AVWMON7", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "randomMonsterLevel7", + "x" : 3, + "y" : 103, + "options" : { + "character" : "hostile", + "neverFlees" : true, + "noGrowing" : true + } + }, + "sign_239" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 5, + "y" : 86, + "options" : { + "text" : "Require achieve level 99; reward: 100 exp" + } + }, + "seerHut_240" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 7, + "y" : 86, + "options" : { + "quest" : { + "heroLevel" : 99, + "missionType" : "Level" + }, + "reward" : { + "experience" : 100 + } + } + }, + "sign_241" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 8, + "y" : 86, + "options" : { + "text" : "Require: achieve primary skills: 5,4,3,2; reward: 999 mana" + } + }, + "seerHut_242" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 10, + "y" : 86, + "options" : { + "quest" : { + "missionType" : "PrimaryStat", + "primarySkills" : { + "attack" : 5, + "defence" : 4, + "knowledge" : 2, + "spellpower" : 3 + } + }, + "reward" : { + "mana" : 999 + } + } + }, + "seerHut_243" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 13, + "y" : 86, + "options" : { + "quest" : { + "killTarget" : "prison_263", + "missionType" : "KillHero" + }, + "reward" : { + "morale" : 3 + } + } + }, + "sign_244" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 11, + "y" : 86, + "options" : { + "text" : "Require: defeat specific hero: Valeska the Knight; reward: morale +3 " + } + }, + "seerHut_245" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 16, + "y" : 86, + "options" : { + "quest" : { + "killTarget" : "monster_214", + "missionType" : "KillCreature" + }, + "reward" : { + "luck" : 2 + } + } + }, + "sign_246" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 14, + "y" : 86, + "options" : { + "text" : "Require: defeat specific monster: Pikeman at quest guard; reward: luck +2" + } + }, + "sign_247" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 17, + "y" : 86, + "options" : { + "text" : "Require: return with artifacts: angel wings; reward: 99999 gold" + } + }, + "seerHut_248" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 19, + "y" : 86, + "options" : { + "quest" : { + "artifacts" : [ + "angelWings" + ], + "missionType" : "Artifact" + }, + "reward" : { + "resource.gold" : 99999 + } + } + }, + "sign_249" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 20, + "y" : 86, + "options" : { + "text" : "Require: creature 100 archers ; reward: 99 knowledge" + } + }, + "sign_250" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 23, + "y" : 86, + "options" : { + "text" : "Require: resources 10,20,30,40,50,60,70 ; reward: expert Necromancy" + } + }, + "sign_251" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 29, + "y" : 86, + "options" : { + "text" : "Require: belong to specific player Purple; reward: spell Fly" + } + }, + "sign_252" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 26, + "y" : 86, + "options" : { + "text" : "Require: be specific hero Catherine the Knight ; reward: artifact Angelic Alliance" + } + }, + "sign_253" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 32, + "y" : 86, + "options" : { + "text" : "Require: return with 8 artifacts: angel wings - bird of perception; reward: 777 cyclops knight" + } + }, + "sign_254" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 35, + "y" : 86, + "options" : { + "text" : "Require: return with 7 creatures: pikeman - marksman ; reward: none" + } + }, + "seerHut_255" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 22, + "y" : 86, + "options" : { + "quest" : { + "creatures" : [ + { + "amount" : 100, + "type" : "archer" + } + ], + "missionType" : "Army" + }, + "reward" : { + "primarySkill.knowledge" : 99 + } + } + }, + "seerHut_256" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 25, + "y" : 86, + "options" : { + "quest" : { + "missionType" : "Resources", + "resources" : { + "crystal" : 50, + "gems" : 60, + "gold" : 70, + "mercury" : 20, + "ore" : 30, + "sulfur" : 40, + "wood" : 10 + } + }, + "reward" : { + "secondarySkill.necromancy" : 3 + } + } + }, + "seerHut_257" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 28, + "y" : 86, + "options" : { + "quest" : { + "hero" : "catherine", + "missionType" : "Hero" + }, + "reward" : { + "artifact.angelicAlliance" : 1 + } + } + }, + "seerHut_258" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 31, + "y" : 86, + "options" : { + "quest" : { + "missionType" : "Player", + "player" : "purple" + }, + "reward" : { + "spell.fly" : 1 + } + } + }, + "seerHut_259" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 34, + "y" : 86, + "options" : { + "quest" : { + "artifacts" : [ + "armorOfWonder", + "badgeOfCourage", + "birdOfPerception", + "angelWings", + "armsOfLegion", + "armageddonsBlade", + "angelicAlliance", + "armorOfTheDamned" + ], + "missionType" : "Artifact" + }, + "reward" : { + "creature.cyclopKing" : 777 + } + } + }, + "seerHut_260" : { + "l" : 0, + "subtype" : "2", + "template" : { + "animation" : "AVXSEEB0", + "editorAnimation" : "AVXSEEB0", + "mask" : [ + "VVV", + "VVV", + "VAV" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "seerHut", + "x" : 37, + "y" : 86, + "options" : { + "quest" : { + "creatures" : [ + { + "amount" : 1, + "type" : "pikeman" + }, + { + "amount" : 1, + "type" : "halberdier" + }, + { + "amount" : 1, + "type" : "archer" + }, + { + "amount" : 1, + "type" : "marksman" + }, + { + "amount" : 1, + "type" : "griffin" + }, + { + "amount" : 1, + "type" : "royalGriffin" + }, + { + "amount" : 1, + "type" : "swordsman" + } + ], + "missionType" : "Army" + }, + "reward" : {} + } + }, + "sign_261" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 2, + "y" : 105, + "options" : { + "text" : "monster peasant: 777 don't grow, friendly, never flee, msg \"peasantmsg\", treasure resource: 99999 each, torso of legion" + } + }, + "monster_262" : { + "l" : 0, + "subtype" : "peasant", + "template" : { + "animation" : "AVWPEAS", + "editorAnimation" : "AVWPEAS", + "mask" : [ + "VV", + "VA" + ], + "visitableFrom" : [ + "+++", + "+-+", + "+++" + ] + }, + "type" : "monster", + "x" : 3, + "y" : 105, + "options" : { + "amount" : 777, + "character" : "friendly", + "neverFlees" : true, + "noGrowing" : true, + "rewardArtifact" : "torsoOfLegion", + "rewardMessage" : "peasantmsg", + "rewardResources" : { + "crystal" : 99999, + "gems" : 99999, + "gold" : 99999, + "mercury" : 99999, + "ore" : 99999, + "sulfur" : 99999, + "wood" : 99999 + } + } + }, + "prison_263" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 13, + "options" : { + "type" : "valeska" + } + }, + "sign_264" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 13, + "options" : { + "text" : "default options" + } + }, + "prison_265" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 16, + "options" : { + "experience" : 99999999, + "name" : "Anul", + "patrolRadius" : 9, + "portrait" : "orrin", + "type" : "luna", + "female" : false + } + }, + "prison_266" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 19, + "options" : { + "secondarySkills" : { + "artillery" : "advanced", + "learning" : "expert", + "offence" : "basic", + "armorer" : "advanced", + "intelligence" : "expert", + "sorcery" : "basic", + "resistance" : "advanced", + "firstAid" : "expert" + }, + "type" : "orrin" + } + }, + "prison_267" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 22, + "options" : { + "artifacts" : { + "head" : "admiralsHat", + "leftHand" : "shieldOfTheDamned", + "rightHand" : "armageddonsBlade", + "shoulders" : "angelWings", + "spellbook" : "spellBook", + "torso" : "armorOfWonder" + }, + "type" : "edric" + } + }, + "prison_268" : { + "l" : 0, + "subtype" : "prison", + "template" : { + "animation" : "AVXPRSN0", + "editorAnimation" : "AVXPRSN0", + "mask" : [ + "VVV", + "VVV", + "VBA" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "prison", + "x" : 33, + "y" : 25, + "options" : { + "spellBook" : [ + "summonBoat", + "scuttleBoat", + "visions", + "viewEarth", + "disguise", + "viewAir", + "fly", + "waterWalk", + "dimensionDoor", + "townPortal", + "quicksand", + "landMine", + "forceField", + "fireWall", + "earthquake", + "magicArrow", + "iceBolt", + "lightningBolt", + "implosion", + "chainLightning", + "frostRing", + "fireball", + "inferno", + "meteorShower", + "deathRipple", + "destroyUndead", + "armageddon", + "shield", + "airShield", + "fireShield", + "protectAir", + "protectFire", + "protectWater", + "protectEarth", + "antiMagic", + "dispel", + "magicMirror", + "cure", + "resurrection", + "animateDead", + "sacrifice", + "bless", + "curse", + "bloodlust", + "precision", + "weakness", + "stoneSkin", + "disruptingRay", + "prayer", + "mirth", + "sorrow", + "fortune", + "misfortune", + "haste", + "slow", + "slayer", + "frenzy", + "counterstrike", + "berserk", + "hypnotize", + "forgetfulness", + "blind", + "teleport", + "removeObstacle", + "clone", + "fireElemental", + "earthElemental", + "waterElemental", + "airElemental" + ], + "type" : "sorsha" + } + }, + "sign_269" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 16, + "options" : { + "text" : "Elementalist, Luna, Anul, 99999999 exp, Orrin avatar, male, patrol 9 squares" + } + }, + "sign_270" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 19, + "options" : { + "text" : "secondary skills from end of list: Expert (first aid), Advanced, Basic (Offence), Expert, Advanced, Basic, Expert, Advanced" + } + }, + "sign_271" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 22, + "options" : { + "text" : "Arts: have spellbook, head: Admirals hat, shoulders: angel wings, right hand: armagedons blade; left hand: shield of damned; torso: armor of wonder" + } + }, + "sign_272" : { + "l" : 0, + "subtype" : "object", + "template" : { + "animation" : "AVXSNDG0", + "editorAnimation" : "AVXSNDG0", + "mask" : [ + "A" + ], + "visitableFrom" : [ + "---", + "+-+", + "+++" + ] + }, + "type" : "sign", + "x" : 31, + "y" : 25, + "options" : { + "text" : "have all spells" + } + } +} \ No newline at end of file diff --git a/test/testdata/ObjectPropertyTest/surface_terrain.json b/test/testdata/ObjectPropertyTest/surface_terrain.json new file mode 100644 index 000000000..4e44f6b2e --- /dev/null +++ b/test/testdata/ObjectPropertyTest/surface_terrain.json @@ -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_"]] \ No newline at end of file diff --git a/test/testdata/ObjectPropertyTest/underground_terrain.json b/test/testdata/ObjectPropertyTest/underground_terrain.json new file mode 100644 index 000000000..53b046917 --- /dev/null +++ b/test/testdata/ObjectPropertyTest/underground_terrain.json @@ -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_"]] \ No newline at end of file diff --git a/test/TerrainViewTest.h3m b/test/testdata/TerrainViewTest.h3m similarity index 100% rename from test/TerrainViewTest.h3m rename to test/testdata/TerrainViewTest.h3m diff --git a/test/terrainViewMappings.json b/test/testdata/terrainViewMappings.json similarity index 100% rename from test/terrainViewMappings.json rename to test/testdata/terrainViewMappings.json