Fichier NPCs

De T4C Tech
Révision datée du 7 mars 2016 à 21:21 par FunJp (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Format du fichier NPCs.wda

Sur cette page vous seront exposés tous les algorithmes et les constantes nécessaires à la programmation de votre propre éditeur de PNJs. Les index de liste déroulante sont les mêmes que ceux des listes déroulantes de l'éditeur Vircom. Le cryptage est un XOR sur des blocs de données de 3418 octets.

Indices des commandes

Les valeurs entre parenthèses sont les valeurs hexa swappées, c'est à dire exactement telles qu'elles apparaissent dans le fichier décrypté parcouru avec un éditeur hexadécimal. Tous les paramètres sont des chaînes de caractères, y compris ceux qui sont censés ne contenir qu'une valeur numérique.

Structures conditionnelles

Ces valeurs définissent des sous-blocs d'instructions. Ce ne sont pas des instructions à proprement parler mais des marqueurs de sous-bloc.

Valeur		Structure	Rôle
================================================================================================
2 (02000000)	IF		Evaluation d'expression et branchement conditionnel
5 (05000000)	FOR		Répétition d'un bloc un nombre défini de fois
6 (06000000)	WHILE		Répétition d'un bloc tant qu'une condition évaluée est vraie

Cas spécial:
20 (14000000)	ASSIGNATION	Assignation d'une valeur à une variable temporaire

Instructions originales présentes dans la version 1.25 de Vircom

Valeur		Nom de la commande	Params	Paramètre 1	Paramètre 2	Paramètre 3
================================================================================================
7 (07000000)	GiveItem		1	ID de l'objet
8 (08000000)	GiveXP			1	Formule
9 (09000000)	SetFlag			2	ID du flag	Formule
10 (0A000000)	HealPlayer		1	Formule
11 (0B000000)	SayText			1	Texte
12 (0C000000)	BreakConversation	0
13 (0D000000)	FightPlayer		0
14 (0E000000)	TakeItem		1	ID de l'objet
15 (0F000000)	Teleport		3	Position X	Position Y	Monde
16 (10000000)	CastSpell		1	ID du sort
17 (11000000)	CastSpellOnNPC		1	ID du sort
18 (12000000)	GiveGold		1	Formule
19 (13000000)	TakeGold		1	Formule
21 (15000000)	DisplayItemsSoldByNPC	0
22 (16000000)	DisplayItemsBoughtByNPC	0
23 (17000000)	DisplayTrainedSkills	0
24 (18000000)	DisplayTaughtSkills	0

Additions de Dialsoft pour la V2

Valeur		Nom de la commande	Params	Paramètre 1	Paramètre 2	Paramètre 3
================================================================================================
25 (19000000)	PrivateSysMessage	1	Texte
26 (1A000000)	GlobalSysMessage	1	Texte
27 (1B000000)	ShoutMessage		2	Nom du canal	Message
28 (1E000000)	SetGlobalFlag		2	ID du flag	Formule
29 (1F000000)	GiveKarma		1	Formule

Structure du fichier NPCs.wda décrypté

TODO: mettre en forme

Taille		type			Description
===============================================================================
4		unsigned long		Type de WDA ou signature (toujours 1)

Bloc des PNJs
=============
4		unsigned long		Nombre de PNJs

Pour chaque PNJ:
{
	4		unsigned long		Taille de la chaîne de caractères suivante
	(variable)	char *			Nom du PNJ
	4		unsigned long		Taille de la chaîne de caractères suivante
	(variable)	char *			ID du PNJ
	4		unsigned long		Version du PNJ (Par défaut 1 si 2 c'est une nouveauté de Dialsoft)
	4		unsigned long		Taille de la chaîne de caractères suivante
	(variable)	char *			Apparence du PNJ

	Si Version du PNJ == 2 (Version dialsoft):
	{
		1		unsigned char		Le PNJ peut ce déplacer
		1		unsigned char		Le PNJ parle en messages privés	
		for (int i = 0; i < 512; i++) {
			1		unsigned char			Dummy (Merci pour cette stupidité...)
		}
	}

	4		unsigned long		Nombre d'objets vendus par le PNJ

	Pour chaque objet vendu par le PNJ:
	{
		4		unsigned long		Taille de la chaîne de caractères suivante
		(variable)	char *			ID de l'objet
		4		unsigned long		Prix de l'objet
	}

	4		unsigned long		Nombre de types d'objets achetés par le PNJ

	Pour chaque type d'objet acheté par le PNJ:
	{
		4		unsigned long		ID du type d'objet (NON SEQUENTIEL)
		4		unsigned long		Prix minimum pour ce type d'objet
		4		unsigned long		Prix maximum pour ce type d'objet
	}

	4		unsigned long		Nombre d'entraînements dispensés par le PNJ

	Pour chaque entraînement dispensé par le PNJ:
	{
		4		unsigned long		ID de la compétence à entraîner (NON SEQUENTIEL)
		4		unsigned long		Points maximum obtenables dans la compétence
		4		unsigned long		Prix de l'entraînement par point de compétence entraîné
	}

	4		unsigned long		Nombre d'enseignements dispensés par le PNJ

	Pour chaque enseignement dispensé par le PNJ:
	{
		4		unsigned long		ID du sort à enseigner
		4		unsigned long		Coût en points de compétences de l'enseignement
		4		unsigned long		Prix de l'enseignement
	}

	4		unsigned long		??? (toujours 1)
	4		unsigned long		??? (toujours 1)
	4		unsigned long		Nombre de répliques

	Pour chaque réplique:
	{
		4		unsigned long		??? (toujours 1)
		1		unsigned char		Type de réplique (0 = normale, 1 = texte initial, 2 = par défaut)
		4		unsigned long		Relation entre les mots-clés (1 = ET, 2 = OU, 3 = ordonné)
		4		unsigned long		Nombre de mots-clés (0 pour texte initial et texte par défaut)

		Pour chaque mot-clé:
		{
			4		unsigned long		Taille de la chaîne de caractères suivante
			(variable)	char *			Mot-clé
		}

	+--> ::	4		unsigned long		??? (toujours 1)
	|    ::	4		unsigned long		??? (toujours 1)
	|    ::	4		unsigned long		Nombre d'instructions
	|    ::
	|    ::	Pour chaque instruction:
	|    ::	{
	|    ::		4		unsigned long		ID de l'instruction
	|    ::
	|    ::		Si ID de l'instruction == "IF" (02000000)
	|    ::		{
	|    ::			4		unsigned long		Taille de la chaîne de caractères suivante
	|    ::			(variable)	char *			Condition de l'instruction
	|    ::
	|    ::			1		unsigned char		Présence de cas général (ELSE)
	|    ::
	|    ::			Si présence de cas général:
	|    ::			{
	+----::------------------------	Réentrance
	|    ::			}
	|    ::
	|    ::			4		unsigned long		Nombre de cas supplémentaires (ELSE IF)
	|    ::
	|    ::			Pour chaque cas supplémentaire:
	|    ::			{
	|    ::				4		unsigned long		Taille de la chaîne de caractères suivante
	|    ::				(variable)	char *			Condition du cas
	+----::------------------------ Réentrance
	|    ::			}
	|    ::
	+----::---------------- Réentrance
	|    ::		}
	|    ::		Sinon si ID de l'instruction == "FOR" (05000000)
	|    ::		{
	|    ::			4		unsigned long		Taille de la chaîne de caractères suivante
	|    ::			(variable)	char *			Valeur de départ de la boucle
	|    ::			4		unsigned long		Taille de la chaîne de caractères suivante
	|    ::			(variable)	char *			Valeur d'arrivée de la boucle
	|    ::			4		unsigned long		Taille de la chaîne de caractères suivante
	|    ::			(variable)	char *			Nom de la variable à incrémenter
	+----::---------------- Réentrance
	|    ::		}
	|    ::		Sinon si ID de l'instruction == "WHILE" (06000000)
	|    ::		{
	|    ::			4		unsigned long		Taille de la chaîne de caractères suivante
	|    ::			(variable)	char *			Condition de la boucle
	+----::---------------- Réentrance
	     ::		}
	     ::		Sinon si ID de l'instruction == NOMINATION (14000000)
	     ::		{
	     ::			4		unsigned long		Taille de la chaîne de caractères suivante
	     ::			(variable)	char *			Variable
	     ::			4		unsigned long		Taille de la chaîne de caractères suivante
	     ::			(variable)	char *			Valeur
	     ::		}
	     ::		Sinon
	     ::		{
	     ::			4		unsigned long		Nombre de paramètres de l'instruction
	     ::
	     ::			Pour chaque paramètre de l'instruction:
	     ::			{
	     ::				4		unsigned long		Taille de la chaîne de caractères suivante
	     ::				(variable)	char *			Paramètre de l'instruction
	     ::			}
	     ::			4		unsigned long		??? (toujours 1)
	     ::		}
	     ::
	     ::	}
	}
}

Cryptographie des fichiers WDA

Clé de cryptage

Il s'agit d'un tableau de 3418 octets choisis arbitrairement par Vircom pour masquer les données originales avec la technique du ou exclusif (XOR). Cette technique est la technique d'encryption la plus simple qui soit : la même clé, combinée à la même opération, soit encrypte soit décrypte chaque octet des données sur laquelle elle s'applique.

Voici la clé utilisée par Vircom pour masquer les données :

unsigned char key[3418] = 
{
	0xE1, 0xC4, 0x9B, 0x1B, 0xC0, 0xC6, 0x30, 0xC5, 0x0D, 0x58, 0xB7, 0x01, 0xCE, 0x7F, 0x33, 0xD3, 0x07, 0x3D, 0xA9,
	0x3F, 0xBA, 0x99, 0x1C, 0x4A, 0xED, 0x94, 0x90, 0xF7, 0xA3, 0x33, 0x09, 0x4A, 0xE1, 0x7B, 0x8B, 0x47, 0xA9, 0x6F,
	0x1B, 0xF3, 0x01, 0x14, 0xBC, 0x51, 0xED, 0x6C, 0x73, 0x65, 0x6F, 0x7D, 0x42, 0x34, 0x8D, 0x4A, 0x2F, 0xC1, 0x4A,
	0xD8, 0x3D, 0x10, 0xAA, 0x2A, 0x71, 0x25, 0xB1, 0x43, 0xCD, 0x05, 0x64, 0x2A, 0x57, 0xB3, 0xC6, 0xE0, 0x12, 0x33,
	0xDC, 0x6B, 0x03, 0x89, 0xA8, 0xCE, 0x2C, 0xBA, 0x30, 0x0D, 0x93, 0xC9, 0x77, 0x2D, 0x3C, 0xBA, 0x82, 0x31, 0x29,
	0x91, 0x53, 0x1D, 0x60, 0x53, 0xF0, 0xF5, 0xE4, 0x03, 0x5C, 0xBE, 0xB9, 0xA5, 0x9C, 0x7B, 0xE4, 0x3E, 0xB2, 0x30,
	0x68, 0xD1, 0xA4, 0xE1, 0x49, 0x62, 0x76, 0x93, 0x8B, 0xF5, 0x2A, 0x49, 0x33, 0x8F, 0xC6, 0x07, 0x44, 0x32, 0x4D,
	0xD1, 0xC2, 0xE4, 0xC3, 0xAC, 0xB1, 0xA9, 0x2D, 0x9B, 0x16, 0x84, 0x8E, 0xA2, 0xF4, 0x78, 0xEA, 0xC6, 0x4F, 0x8C,
	0x45, 0x0A, 0x2C, 0xC1, 0xA4, 0x72, 0x8D, 0x1D, 0x0A, 0x02, 0x79, 0xA3, 0x7B, 0xBF, 0xF1, 0x57, 0xFB, 0xAC, 0xFA,
	0x3D, 0x8F, 0xCD, 0x99, 0x5A, 0x3A, 0x26, 0xD1, 0xB1, 0x00, 0xBC, 0xA7, 0x47, 0xE6, 0x92, 0x1D, 0x1E, 0xEE, 0xAC,
	0x39, 0x3C, 0x1E, 0x0E, 0xFE, 0xA4, 0x7A, 0xBD, 0x71, 0x5A, 0x04, 0xBC, 0x94, 0x63, 0xC2, 0x0F, 0x6D, 0xC2, 0xB7,
	0xBB, 0x00, 0x7B, 0xE7, 0xC3, 0x4F, 0x92, 0x57, 0x2B, 0x60, 0x0C, 0x0A, 0xF7, 0x36, 0xEC, 0x04, 0x2C, 0xD5, 0x36,
	0x49, 0xCC, 0x42, 0xEF, 0xDE, 0x7F, 0x1A, 0xC6, 0x63, 0x92, 0xBB, 0x05, 0x61, 0x7F, 0xD6, 0xA0, 0xDB, 0x48, 0x6F,
	0x99, 0xD5, 0xF3, 0x8B, 0xF6, 0x53, 0x83, 0x2D, 0xBB, 0x5A, 0xFD, 0x5A, 0xEA, 0xED, 0x63, 0x14, 0x89, 0x10, 0xBB,
	0x61, 0x9B, 0xC8, 0x09, 0x44, 0x24, 0x17, 0x4F, 0xC2, 0x29, 0x03, 0x93, 0xDD, 0xAD, 0x90, 0xD8, 0x9B, 0xB4, 0xC0,
	0x22, 0xFF, 0x42, 0x99, 0x76, 0x0E, 0x5C, 0x1E, 0xD6, 0xCB, 0x05, 0x54, 0x48, 0x3A, 0x41, 0x3D, 0xD0, 0x5F, 0x15,
	0xDF, 0x70, 0x3E, 0x83, 0x3D, 0x2E, 0xDC, 0x91, 0x5C, 0x0D, 0x3C, 0x43, 0x3E, 0x12, 0x63, 0x9B, 0xE9, 0x3F, 0x53,
	0x9F, 0x61, 0x9A, 0x12, 0x52, 0xA8, 0x26, 0xA3, 0xB8, 0xC4, 0xE8, 0x0B, 0xD6, 0xB8, 0xE3, 0x4C, 0xAF, 0x88, 0x1B,
	0x6C, 0x47, 0x39, 0x94, 0x6E, 0xA2, 0xCD, 0x52, 0x57, 0xC5, 0x4B, 0x5A, 0x29, 0xB3, 0xB4, 0xAF, 0xEA, 0x70, 0x0E,
	0x55, 0x9E, 0x00, 0x5B, 0x51, 0x47, 0x68, 0xA2, 0xA6, 0xEB, 0xAB, 0xE4, 0x58, 0x8D, 0xCD, 0x27, 0x6B, 0x31, 0xD3,
	0x6E, 0xE4, 0xDC, 0xC0, 0xBD, 0xC6, 0x91, 0x98, 0x18, 0x15, 0x54, 0x5F, 0x84, 0xD5, 0x29, 0x19, 0x04, 0x0B, 0x15,
	0xCB, 0x9C, 0xBA, 0x1B, 0x78, 0x51, 0xE6, 0x3F, 0x25, 0x26, 0x94, 0x85, 0xD4, 0x1F, 0xC7, 0xF2, 0x8B, 0x40, 0x83,
	0x89, 0x4D, 0x8E, 0xCC, 0x4E, 0x1F, 0x0C, 0xA6, 0x46, 0x03, 0xBE, 0x16, 0x74, 0xFF, 0xA8, 0x1F, 0xDC, 0x17, 0xCF,
	0xC6, 0x82, 0x4D, 0x36, 0x0D, 0x6A, 0xA7, 0xE1, 0xFA, 0x99, 0x28, 0xD4, 0x90, 0x12, 0xD4, 0x14, 0xD4, 0xDA, 0xB0,
	0xA4, 0xC9, 0xF3, 0xBF, 0x88, 0x72, 0x63, 0x05, 0xC5, 0xD6, 0x2D, 0x86, 0x5E, 0xF6, 0x56, 0x47, 0x57, 0xD8, 0xE0,
	0x4A, 0xB4, 0x7F, 0xD1, 0x96, 0x7A, 0xEF, 0x2D, 0x2C, 0xAB, 0x2D, 0xF6, 0x12, 0x4D, 0x3C, 0x32, 0x4B, 0x64, 0x20,
	0xE4, 0xDB, 0xF3, 0xDD, 0x10, 0xC6, 0xFD, 0x78, 0xBB, 0x11, 0x89, 0xF3, 0xE8, 0xBF, 0x98, 0x55, 0x9B, 0xD4, 0x30,
	0x9F, 0xD8, 0x55, 0x54, 0xD7, 0xA4, 0x45, 0x08, 0x00, 0x01, 0xA8, 0x50, 0x1E, 0xF6, 0x82, 0x31, 0x35, 0x84, 0xD8,
	0xAE, 0x4A, 0xB1, 0xAD, 0xCC, 0x60, 0x80, 0x05, 0x8D, 0x7B, 0xF5, 0xE4, 0xF7, 0xA0, 0x14, 0x4F, 0x0D, 0xD1, 0xE2,
	0x49, 0xD3, 0x15, 0x62, 0xD6, 0x4E, 0x6D, 0x98, 0xFA, 0x81, 0xDE, 0x89, 0xBA, 0x70, 0x6D, 0x38, 0x19, 0x20, 0x1D,
	0xA9, 0x1B, 0x93, 0xF3, 0xE0, 0xC5, 0xCF, 0xF1, 0xE2, 0x1A, 0xD7, 0x1D, 0xB1, 0x1E, 0xB0, 0x7B, 0x54, 0xD5, 0x5D,
	0x0D, 0xCC, 0x43, 0xE2, 0xD9, 0x1F, 0x6D, 0x43, 0xE2, 0x4F, 0x56, 0x85, 0x2C, 0x63, 0x03, 0xAA, 0xBB, 0x5C, 0x76,
	0xB8, 0x94, 0x40, 0xB5, 0xB3, 0xBA, 0x12, 0xC4, 0x9D, 0x32, 0xD6, 0xA5, 0x7C, 0xFE, 0x91, 0x5E, 0x53, 0x24, 0x45,
	0xF2, 0x27, 0xA7, 0xF8, 0x65, 0xFB, 0x8B, 0xAE, 0xBB, 0xD2, 0xD5, 0x69, 0xF9, 0xB3, 0x88, 0x2F, 0x22, 0x9F, 0xA8,
	0x03, 0x3A, 0x9C, 0x3A, 0xEA, 0x46, 0xAD, 0x40, 0xE6, 0x49, 0xD6, 0xC0, 0xFD, 0x47, 0x1C, 0xBD, 0x32, 0x44, 0x82,
	0x3C, 0x8A, 0x45, 0x0C, 0x40, 0x07, 0x4D, 0xBE, 0xCD, 0xAF, 0x60, 0x9D, 0xE7, 0x86, 0x82, 0xAB, 0x93, 0x8E, 0xB8,
	0xEF, 0xD3, 0xCD, 0x05, 0x6A, 0xAE, 0x46, 0x6D, 0x22, 0x25, 0xFD, 0xF5, 0x1A, 0x3E, 0xF7, 0xA0, 0x56, 0xFB, 0x37,
	0x72, 0xDA, 0x63, 0xC1, 0x6F, 0xAB, 0x77, 0x99, 0x9B, 0xCC, 0x3D, 0xC4, 0xFB, 0x41, 0xB8, 0x45, 0x92, 0x0F, 0xEC,
	0x20, 0x65, 0x38, 0xDD, 0x59, 0x76, 0xC2, 0x90, 0xF5, 0xCB, 0xB1, 0x08, 0xF7, 0x67, 0x07, 0x49, 0x63, 0x4F, 0xCA,
	0x58, 0x3E, 0x85, 0xFD, 0x38, 0x8A, 0x0F, 0xA5, 0xED, 0x4D, 0xF0, 0xC4, 0x7B, 0x8B, 0x2D, 0x60, 0xE7, 0x46, 0xC9,
	0x7C, 0x34, 0x84, 0xC8, 0x1D, 0x66, 0x48, 0x2E, 0x46, 0x81, 0x96, 0xFF, 0xFB, 0x8A, 0x73, 0x40, 0x84, 0xE2, 0xF4,
	0x19, 0x73, 0xE7, 0x20, 0x8B, 0x5B, 0x86, 0xC6, 0x99, 0x41, 0xC4, 0xEC, 0x47, 0x28, 0xA4, 0x95, 0x9A, 0x14, 0x2A,
	0xC6, 0x95, 0x0A, 0x5B, 0x81, 0x3C, 0x0D, 0x39, 0xCC, 0x93, 0x21, 0xCA, 0xAA, 0x9F, 0x4A, 0x12, 0x20, 0x63, 0x8D,
	0x13, 0x31, 0xE3, 0xEC, 0xD3, 0xE1, 0x23, 0x6E, 0x55, 0x34, 0x28, 0x14, 0x9D, 0x2E, 0xF5, 0xE4, 0xB0, 0xD4, 0x8E,
	0xE1, 0x91, 0x29, 0xF8, 0x0F, 0x44, 0x32, 0x36, 0x72, 0xCD, 0xF1, 0x4C, 0x0F, 0x31, 0x6C, 0x3E, 0xE9, 0x73, 0xA6,
	0x10, 0x04, 0x97, 0xA3, 0xC7, 0x65, 0xA2, 0x68, 0x66, 0x0E, 0x96, 0xF8, 0xF2, 0x05, 0x79, 0x57, 0x6D, 0x4E, 0x8A,
	0xDD, 0xEB, 0x1A, 0x93, 0x45, 0xE2, 0xE0, 0x78, 0xAA, 0x36, 0xA4, 0x3D, 0x0E, 0xEC, 0x6A, 0xE4, 0x77, 0x06, 0x37,
	0x73, 0xE9, 0x8A, 0x0E, 0xED, 0x66, 0x7B, 0xF3, 0x56, 0xF4, 0xDE, 0xEA, 0xB3, 0x96, 0xB5, 0xF8, 0x07, 0x50, 0x06,
	0x20, 0x56, 0x27, 0xD5, 0x66, 0xA4, 0x1D, 0x24, 0xCE, 0xF6, 0x38, 0xF9, 0x5D, 0x4E, 0x7C, 0x57, 0x16, 0xB3, 0xEB,
	0x42, 0xFD, 0x26, 0x8B, 0xBF, 0x17, 0xAD, 0x5F, 0xD1, 0x66, 0x4B, 0x6C, 0x7C, 0xF0, 0x04, 0xB4, 0xC4, 0xB9, 0xDC,
	0x3D, 0xAE, 0xC3, 0xD8, 0x0B, 0x3D, 0x14, 0xFB, 0x20, 0x75, 0xAF, 0x49, 0x82, 0x5A, 0x98, 0xC7, 0x34, 0xF1, 0xD4,
	0x78, 0x3A, 0x3D, 0x66, 0x60, 0x99, 0x42, 0x52, 0x83, 0x53, 0x04, 0x9D, 0xE6, 0x6E, 0x88, 0x49, 0x8C, 0xEE, 0xD1,
	0x5C, 0x79, 0xD5, 0xE3, 0xD9, 0xB1, 0x29, 0xC3, 0xC5, 0x39, 0xED, 0x74, 0x23, 0x14, 0x26, 0xFA, 0xF7, 0x46, 0xD6,
	0x59, 0x45, 0xD4, 0x03, 0x96, 0x11, 0xC0, 0xB0, 0xB4, 0x60, 0x10, 0xE2, 0xB7, 0x35, 0xC8, 0x9C, 0xA3, 0x95, 0xEA,
	0xE1, 0x7D, 0x82, 0x7C, 0xB8, 0x48, 0x02, 0x81, 0x22, 0x08, 0x18, 0xFD, 0x25, 0xC1, 0xC9, 0xF5, 0xC4, 0x78, 0x17,
	0x6C, 0x03, 0x30, 0x08, 0x66, 0xE7, 0xED, 0xA0, 0xE7, 0x73, 0xB4, 0xE1, 0xF4, 0xAB, 0x88, 0xD1, 0x90, 0x93, 0x6D,
	0x73, 0xBF, 0x30, 0x67, 0xCB, 0x86, 0x85, 0x7B, 0xDE, 0xE7, 0x96, 0xAC, 0xAE, 0xE8, 0x67, 0xFE, 0x41, 0x8C, 0xFD,
	0x75, 0x9B, 0xD8, 0x5B, 0x16, 0xBE, 0xCF, 0x85, 0xE4, 0xB0, 0x75, 0x80, 0xE3, 0x74, 0xCE, 0x4E, 0x17, 0x0F, 0xDF,
	0xF5, 0x85, 0x83, 0xAB, 0x79, 0x30, 0xD6, 0x36, 0xDC, 0x1C, 0x0B, 0x84, 0x24, 0x4E, 0x27, 0x9A, 0x54, 0xC8, 0x2D,
	0x7B, 0x71, 0x91, 0x21, 0x2B, 0x7D, 0xAA, 0x07, 0xAE, 0x7E, 0x18, 0xE3, 0x09, 0x77, 0xE0, 0xBA, 0x3F, 0x6D, 0x05,
	0x8F, 0x54, 0x62, 0x8C, 0x66, 0x4D, 0x5C, 0x77, 0x44, 0x2C, 0x5E, 0xCC, 0x2C, 0xF7, 0x6D, 0x8E, 0x22, 0xB2, 0x8C,
	0xC2, 0x2A, 0x5F, 0xBF, 0x6B, 0x49, 0x04, 0x0A, 0x8D, 0x82, 0xA4, 0x71, 0x2C, 0xD9, 0x44, 0xF9, 0x4C, 0x53, 0xE6,
	0xA5, 0xF2, 0x90, 0x7A, 0x21, 0xBC, 0x45, 0x7A, 0xDD, 0xB4, 0x0A, 0xAB, 0x2B, 0xDF, 0xE1, 0x10, 0x0E, 0x40, 0xD0,
	0xAE, 0x8A, 0xDB, 0x87, 0xA3, 0xB4, 0x04, 0xA1, 0x5E, 0xD0, 0x51, 0xFF, 0xBE, 0x31, 0xC5, 0xA6, 0xC7, 0xDD, 0x64,
	0x99, 0x7D, 0xD8, 0x33, 0xDC, 0xE5, 0x24, 0x34, 0x73, 0x02, 0xC7, 0x6E, 0x62, 0xD8, 0xC5, 0xE2, 0xAE, 0x6C, 0x20,
	0x95, 0x5A, 0xC0, 0xDE, 0x8C, 0x6B, 0xDA, 0x02, 0xCB, 0xE3, 0xBE, 0x90, 0x54, 0xC8, 0x6E, 0x8C, 0x2D, 0x1D, 0xF0,
	0xFB, 0x59, 0xE7, 0x47, 0xE0, 0xDC, 0x28, 0x77, 0x3F, 0xBA, 0xE6, 0x85, 0x1D, 0xF8, 0x24, 0x74, 0x7D, 0x99, 0xE7,
	0x48, 0x63, 0xA1, 0x31, 0x05, 0xD3, 0x15, 0x08, 0xB0, 0xD2, 0xF8, 0x70, 0x4C, 0x63, 0x4E, 0x6B, 0xDD, 0x8A, 0x1B,
	0xFF, 0x68, 0x4B, 0x64, 0x2F, 0xEF, 0xAB, 0x2B, 0xFF, 0x78, 0xAD, 0x77, 0x74, 0x07, 0x55, 0x49, 0x91, 0x9E, 0xA7,
	0x5A, 0x43, 0xA8, 0x94, 0xD3, 0xF9, 0x5B, 0x14, 0x01, 0xC4, 0x2B, 0xE7, 0xA9, 0xE8, 0xDE, 0x89, 0xAB, 0xCA, 0x30,
	0xEB, 0xCE, 0x6E, 0x25, 0x12, 0x16, 0xD8, 0xC2, 0x01, 0x88, 0x0D, 0x09, 0xBC, 0x27, 0x10, 0x00, 0x48, 0xF7, 0xE5,
	0xAB, 0xA7, 0xFC, 0x90, 0x0C, 0xDF, 0x3B, 0x16, 0x29, 0xF4, 0xB7, 0x7A, 0x05, 0xE8, 0x74, 0xC0, 0xA5, 0xC1, 0x77,
	0xEC, 0x0B, 0x82, 0xC3, 0x03, 0x3D, 0x2F, 0x5C, 0x08, 0x3E, 0xCD, 0x46, 0xFF, 0x13, 0x5F, 0x86, 0xED, 0xBF, 0xE9,
	0x1E, 0xD5, 0x46, 0x6F, 0x14, 0xBB, 0xAC, 0xF6, 0x6C, 0xA3, 0xF5, 0x81, 0x28, 0x91, 0x26, 0x14, 0x4E, 0x8A, 0x42,
	0xB4, 0xE2, 0x91, 0x4D, 0x64, 0xE6, 0xAB, 0x4C, 0x28, 0x60, 0xDA, 0x42, 0x04, 0x53, 0x24, 0x33, 0xFC, 0xC3, 0x8C,
	0x23, 0x15, 0xB4, 0x17, 0x52, 0x2B, 0xC8, 0x12, 0xB8, 0x2B, 0xA3, 0x18, 0x49, 0xB8, 0xAC, 0x2D, 0x0B, 0xD7, 0xE7,
	0x56, 0x01, 0x8B, 0x59, 0x96, 0x30, 0xD8, 0x05, 0xF1, 0x9A, 0xC2, 0xEF, 0x6C, 0x45, 0x4E, 0x1C, 0x09, 0x34, 0x7F,
	0x8F, 0xCE, 0x6C, 0x59, 0x4C, 0xBF, 0xF0, 0xE0, 0x57, 0xDE, 0xC4, 0x19, 0xB5, 0x31, 0xEC, 0x07, 0x69, 0xBB, 0x6C,
	0xAE, 0x77, 0x81, 0x49, 0x13, 0xE3, 0x85, 0x86, 0x38, 0xB2, 0xCD, 0x27, 0x23, 0xE7, 0x5C, 0x31, 0xD8, 0x86, 0x37,
	0xA7, 0x59, 0x94, 0x60, 0x8D, 0xAC, 0x13, 0xDD, 0xE7, 0xD4, 0x09, 0xB1, 0xBA, 0xD5, 0x7A, 0xE1, 0x09, 0xB4, 0x68,
	0x70, 0xD8, 0x74, 0xD9, 0x62, 0x2C, 0x19, 0xD0, 0xBB, 0x07, 0xA7, 0x51, 0x7F, 0x6F, 0x23, 0x61, 0xB3, 0x67, 0x90,
	0x03, 0x5A, 0xF4, 0xF2, 0x3B, 0x79, 0x19, 0x4E, 0x0D, 0x12, 0xDA, 0xA6, 0x7E, 0x2B, 0x3B, 0x00, 0x91, 0xC7, 0x41,
	0x60, 0x4A, 0xEB, 0xEF, 0xC8, 0xAE, 0x99, 0x49, 0x3E, 0xC0, 0xD7, 0x53, 0xC5, 0x84, 0xA8, 0x12, 0x61, 0xFE, 0x11,
	0x88, 0x17, 0x32, 0x14, 0xBC, 0xEA, 0x25, 0xB7, 0xAF, 0xDE, 0xDA, 0xFE, 0x67, 0xF7, 0x55, 0xEB, 0xE7, 0x3A, 0x9B,
	0x84, 0x33, 0xAA, 0xAF, 0xCC, 0x4F, 0x4B, 0x95, 0xC7, 0x40, 0x22, 0x51, 0x7A, 0x09, 0x31, 0xE8, 0xAF, 0x7E, 0x5D,
	0x15, 0x34, 0x0C, 0xB4, 0x05, 0x9E, 0xE0, 0xF2, 0xBD, 0xF0, 0xFD, 0x19, 0x40, 0x2E, 0x67, 0x2F, 0x92, 0x5D, 0x22,
	0x38, 0xB7, 0x80, 0x33, 0x36, 0xB4, 0x9B, 0x9D, 0x2F, 0x8C, 0xB2, 0x64, 0x26, 0x43, 0xCA, 0x8C, 0x1F, 0xDE, 0xE6,
	0x1A, 0x1F, 0x60, 0x0A, 0x11, 0x29, 0xCD, 0x3B, 0x75, 0x41, 0x29, 0x7B, 0x4A, 0x6B, 0x79, 0xD0, 0x95, 0xAC, 0xBF,
	0x3E, 0x59, 0x07, 0x01, 0xC7, 0x9A, 0x80, 0x43, 0x71, 0x5D, 0x1B, 0x87, 0x3F, 0xA4, 0xDD, 0xD3, 0x35, 0x75, 0xC9,
	0x2B, 0x58, 0xD4, 0xE3, 0x91, 0xAB, 0xC3, 0x30, 0x0B, 0x32, 0x48, 0xB2, 0x9C, 0xF1, 0x66, 0x6F, 0x48, 0xED, 0x21,
	0x6B, 0x13, 0x29, 0x7E, 0xA8, 0x02, 0xA9, 0x80, 0x2C, 0x18, 0x72, 0x2B, 0xFA, 0x59, 0x86, 0x83, 0x17, 0xCA, 0xEB,
	0x8D, 0x85, 0x6E, 0xA5, 0x4C, 0x4A, 0x49, 0xB6, 0xC4, 0x69, 0x5F, 0x24, 0xFA, 0xE7, 0xB5, 0xF2, 0xF1, 0xC6, 0x4E,
	0x24, 0xAD, 0x0C, 0x2E, 0xBF, 0x32, 0xBD, 0x59, 0xC6, 0x84, 0xDB, 0xD4, 0x3D, 0xA8, 0x6C, 0xA2, 0x28, 0xA1, 0x73,
	0xC7, 0x8C, 0x74, 0xF4, 0x47, 0x6C, 0x23, 0xF4, 0x27, 0xCC, 0xB4, 0x75, 0x6A, 0xB0, 0x2A, 0x7E, 0x14, 0x1D, 0x8A,
	0x10, 0x2A, 0x16, 0xD6, 0x30, 0xAF, 0x9F, 0x14, 0xE3, 0xA7, 0xBD, 0x47, 0x2C, 0x16, 0x73, 0x74, 0x10, 0x01, 0xC5,
	0x9E, 0x92, 0x6B, 0xB7, 0xC9, 0xB5, 0x58, 0x4E, 0xF9, 0x80, 0xCC, 0x8C, 0x32, 0xF4, 0xCC, 0x77, 0x79, 0x17, 0x5B,
	0x13, 0xD1, 0xEC, 0x7D, 0x62, 0x3F, 0x77, 0x36, 0x6A, 0xC5, 0xBD, 0x8B, 0x2F, 0x69, 0xC0, 0x7F, 0xB3, 0x2E, 0x87,
	0x16, 0xFC, 0x18, 0x13, 0x55, 0x0D, 0x2C, 0x69, 0x3F, 0xEA, 0x6D, 0x8E, 0xD8, 0x97, 0xDF, 0x85, 0x24, 0x19, 0x87,
	0x53, 0x28, 0x73, 0x67, 0xFA, 0xE6, 0xA9, 0x85, 0x80, 0x65, 0xC0, 0xE5, 0xE9, 0xA6, 0xBB, 0x89, 0x37, 0xAF, 0x9E,
	0x77, 0x70, 0x82, 0x6D, 0xB2, 0x97, 0x26, 0x2D, 0x3E, 0xB0, 0x9C, 0xE1, 0x20, 0xBF, 0xEA, 0x8D, 0x5B, 0xC9, 0x13,
	0x35, 0xF3, 0xD1, 0x1B, 0xDE, 0xEC, 0xDC, 0x07, 0x8B, 0x4B, 0xEC, 0xD9, 0x40, 0x13, 0x07, 0x97, 0x02, 0x48, 0x30,
	0x45, 0xD3, 0xEE, 0x6C, 0xE5, 0xB9, 0x0A, 0xBD, 0x7D, 0xB8, 0x9F, 0x29, 0x10, 0xD2, 0xB1, 0xB3, 0xA2, 0x0D, 0x45,
	0x60, 0x38, 0x6C, 0x5D, 0x32, 0xD5, 0xF3, 0xFF, 0x2F, 0x7D, 0xA7, 0x2F, 0x5B, 0x35, 0x8B, 0xEF, 0xB8, 0xFF, 0xA3,
	0x45, 0x4C, 0xE1, 0xF3, 0x34, 0x1A, 0xDE, 0x80, 0xC1, 0x26, 0xFB, 0x4D, 0xEE, 0x75, 0x3B, 0x5E, 0xC1, 0x0A, 0xA2,
	0xB8, 0x3D, 0xE9, 0x34, 0x5D, 0x67, 0x16, 0xF6, 0x53, 0x41, 0x96, 0xEA, 0x9E, 0xD1, 0x6C, 0x16, 0x40, 0x1A, 0x9C,
	0x7E, 0x3F, 0x21, 0x2A, 0x24, 0x9E, 0xE9, 0x1B, 0x0E, 0x61, 0x76, 0x72, 0x3F, 0x8D, 0xCC, 0x33, 0xBC, 0x25, 0xEF,
	0x62, 0x87, 0x2D, 0xE4, 0x04, 0xA6, 0xA9, 0xAE, 0x1C, 0x1D, 0x9E, 0x52, 0xAE, 0xEE, 0x0F, 0xD2, 0xBF, 0x1F, 0x00,
	0x34, 0x52, 0xB3, 0x75, 0x7B, 0x6B, 0xAE, 0x73, 0xAC, 0x0E, 0x15, 0xFD, 0xC9, 0x40, 0xEA, 0x17, 0xD8, 0x04, 0x34,
	0xC6, 0xDD, 0x5E, 0xF4, 0x0D, 0xDA, 0x52, 0x2F, 0xF0, 0xD5, 0xE5, 0xEA, 0x73, 0xD1, 0x1A, 0x28, 0x9A, 0xD2, 0xF5,
	0xEE, 0x6A, 0xDC, 0x7B, 0x3E, 0xE6, 0xF4, 0xAE, 0x1E, 0x13, 0x1D, 0x94, 0x92, 0xF3, 0x5C, 0x31, 0x9C, 0x8C, 0xB3,
	0x87, 0x42, 0xE1, 0x28, 0x9C, 0x87, 0xF7, 0xBE, 0x73, 0x6F, 0xD1, 0x7A, 0x10, 0xFF, 0x72, 0x5E, 0x78, 0x39, 0xE1,
	0x70, 0xAE, 0x23, 0x1F, 0xB3, 0xB6, 0xC1, 0x32, 0x2C, 0x94, 0x15, 0x1D, 0xDE, 0x4D, 0x25, 0xE4, 0xCC, 0xE4, 0xF4,
	0x8C, 0xFD, 0x5D, 0x87, 0x18, 0x72, 0xBC, 0xE0, 0x8C, 0x31, 0x06, 0x05, 0xEC, 0x3D, 0x3E, 0xF9, 0x3D, 0x9A, 0x68,
	0xC1, 0x82, 0x4D, 0x89, 0x5F, 0xBF, 0x59, 0xA4, 0xD9, 0xF8, 0xC2, 0xBD, 0x33, 0x32, 0x8C, 0xD8, 0x6F, 0x70, 0xBC,
	0xFA, 0x93, 0xB6, 0x55, 0x25, 0xA2, 0x08, 0x5B, 0x60, 0xA0, 0x6B, 0xD2, 0xAC, 0x92, 0xE2, 0xBF, 0x0F, 0x7B, 0x71,
	0x25, 0x8B, 0x5F, 0x1D, 0x08, 0x27, 0x42, 0xE9, 0x6D, 0xE4, 0x29, 0xD9, 0x57, 0xC8, 0x17, 0xF1, 0xCA, 0xD6, 0x10,
	0x36, 0xCA, 0x12, 0x18, 0xAB, 0x5B, 0x80, 0x34, 0x54, 0x82, 0x25, 0x67, 0x35, 0x42, 0x04, 0xB5, 0x53, 0xA0, 0x22,
	0x23, 0xB1, 0x9E, 0x81, 0xB3, 0x53, 0x42, 0x27, 0x6B, 0x3D, 0x8F, 0x17, 0x4F, 0x74, 0x8A, 0x55, 0x61, 0xFB, 0x35,
	0xE6, 0xA7, 0xD6, 0x96, 0xCD, 0x24, 0x0A, 0xB1, 0x0E, 0xDC, 0x9A, 0x88, 0xAD, 0xD4, 0x8A, 0x21, 0xAF, 0x0F, 0xDE,
	0x7F, 0x17, 0x91, 0x9B, 0xA6, 0xE9, 0x5E, 0xC4, 0x9B, 0x2A, 0x7B, 0x5D, 0x60, 0xDD, 0xEB, 0x6A, 0xFB, 0x06, 0xB2,
	0xF0, 0x70, 0xA9, 0xD5, 0xF2, 0xC1, 0xCA, 0x56, 0x74, 0xF4, 0x6E, 0x3B, 0x7A, 0x0C, 0x98, 0x88, 0x09, 0x0E, 0x4D,
	0x3F, 0x24, 0xFD, 0x8F, 0x66, 0xCF, 0xDC, 0x64, 0x00, 0x0F, 0xB2, 0xCF, 0x11, 0xE6, 0x80, 0xD5, 0x9E, 0x5A, 0x4C,
	0x78, 0xAA, 0x6F, 0x19, 0xBE, 0x39, 0x27, 0xEB, 0xAA, 0x4F, 0x88, 0xC7, 0x41, 0xF1, 0x95, 0xAF, 0x86, 0x22, 0x53,
	0xA9, 0x7D, 0xE6, 0xC4, 0xB9, 0x2A, 0x42, 0xEE, 0xE1, 0x91, 0x38, 0xD4, 0x27, 0xB7, 0xCE, 0x7B, 0x8E, 0x9F, 0x08,
	0xE5, 0x1B, 0x4E, 0xE8, 0x18, 0xD0, 0xC6, 0x74, 0x18, 0xB3, 0x0D, 0xAF, 0xE7, 0xC7, 0x26, 0x9D, 0x8B, 0x11, 0x16,
	0x43, 0x07, 0x94, 0xDF, 0xA4, 0x5F, 0x54, 0x87, 0xC4, 0x98, 0x55, 0x11, 0xA7, 0xB5, 0x9B, 0x82, 0x52, 0xBA, 0x2B,
	0xDD, 0xC8, 0xAB, 0x08, 0x25, 0x0D, 0x8D, 0x36, 0x61, 0x25, 0x62, 0xBA, 0x92, 0x15, 0x31, 0x97, 0xBE, 0xE0, 0xFB,
	0xD1, 0xE8, 0x8A, 0xC6, 0x6C, 0x14, 0x18, 0x95, 0x6D, 0x47, 0x8D, 0x6C, 0xD7, 0x84, 0xED, 0x4F, 0xAE, 0xCF, 0x3C,
	0x43, 0xF7, 0x2C, 0x7E, 0x4B, 0xB4, 0xA0, 0xB8, 0x6B, 0xEB, 0x2E, 0xED, 0xA8, 0x9F, 0xDA, 0x22, 0x05, 0xD5, 0xA8,
	0x59, 0x86, 0x90, 0x9D, 0x98, 0x2F, 0xD4, 0xBC, 0xE2, 0x05, 0xA5, 0x09, 0x3C, 0x0B, 0x08, 0x89, 0xA9, 0x45, 0xFF,
	0x3F, 0x2C, 0xB7, 0x90, 0x2F, 0xCC, 0x66, 0xBF, 0x5D, 0x8A, 0x55, 0x8E, 0xCD, 0x6C, 0x88, 0x03, 0x84, 0x75, 0x03,
	0x21, 0x85, 0xA9, 0xCB, 0xED, 0xD5, 0x0D, 0xE3, 0x6A, 0x76, 0xA4, 0x4F, 0x9B, 0x6E, 0x72, 0x14, 0x87, 0xC0, 0x7B,
	0x35, 0x2F, 0x71, 0xC4, 0xB6, 0x99, 0x84, 0x50, 0x9B, 0xC8, 0xFC, 0x23, 0xE9, 0xC0, 0xE0, 0x41, 0xA2, 0x86, 0x31,
	0xAF, 0xCD, 0x1D, 0xF5, 0x70, 0x6B, 0x89, 0x2F, 0x88, 0x82, 0xCE, 0xE3, 0xFB, 0x14, 0xF1, 0x16, 0xCE, 0x28, 0xF4,
	0xCB, 0x04, 0xBF, 0xDE, 0x06, 0xA1, 0xDF, 0xB0, 0xCB, 0xAA, 0x8B, 0x70, 0x1F, 0x22, 0xC7, 0x21, 0x04, 0x0D, 0x98,
	0xC7, 0x81, 0x6F, 0x00, 0x66, 0x97, 0x4D, 0x05, 0x03, 0x4C, 0xAA, 0xAB, 0xA1, 0xA3, 0x8A, 0xF4, 0x44, 0xA0, 0xF1,
	0xE6, 0xF1, 0x47, 0xE4, 0x84, 0xAB, 0x9D, 0x66, 0xD2, 0x76, 0xA5, 0x7B, 0xD5, 0x56, 0x63, 0x27, 0x90, 0x4F, 0xDC,
	0x6F, 0x07, 0x66, 0x13, 0x56, 0x3F, 0x9E, 0x0C, 0xE0, 0x3A, 0xFC, 0xCB, 0x12, 0xFE, 0x83, 0x55, 0xEF, 0x8E, 0x36,
	0xAC, 0x7B, 0xEF, 0x1C, 0xD7, 0xBA, 0x24, 0x36, 0xD7, 0xB0, 0x31, 0x8A, 0xB2, 0x62, 0x1A, 0x1B, 0x6B, 0xD3, 0xE4,
	0xED, 0x06, 0x08, 0x91, 0x04, 0x87, 0x03, 0x27, 0x65, 0xF3, 0xCA, 0xAA, 0x13, 0x4D, 0x61, 0x1C, 0x13, 0x99, 0xCA,
	0x83, 0x67, 0xDC, 0x0B, 0xE2, 0x15, 0x18, 0x27, 0x3E, 0x20, 0x53, 0x22, 0x9A, 0x8D, 0x91, 0x00, 0xFA, 0x5E, 0xD4,
	0xC6, 0x62, 0x99, 0x22, 0x77, 0xD6, 0x41, 0x7E, 0x18, 0x5B, 0xED, 0xAB, 0xF4, 0xE9, 0x71, 0x36, 0xA5, 0xF1, 0x10,
	0xBC, 0x73, 0x77, 0xCD, 0x41, 0x61, 0x7D, 0xAD, 0xCA, 0x73, 0x09, 0xB3, 0x5A, 0xAD, 0x1E, 0xE2, 0xF5, 0x14, 0xC0,
	0x41, 0x9F, 0xAA, 0xF4, 0xD1, 0x5D, 0x76, 0xBC, 0x98, 0x32, 0x79, 0x1F, 0x99, 0x22, 0xB9, 0x1E, 0xD8, 0x32, 0x39,
	0xBF, 0x5A, 0x65, 0xFD, 0x04, 0x22, 0xBF, 0x09, 0xF4, 0x34, 0x44, 0x62, 0x90, 0x94, 0xF8, 0x0B, 0xDE, 0x47, 0xE0,
	0x08, 0xE1, 0x50, 0xFF, 0x5E, 0x9D, 0xB3, 0x5A, 0x0F, 0x16, 0x74, 0xF3, 0x22, 0x51, 0x98, 0xD0, 0x98, 0x51, 0x22,
	0xF4, 0x76, 0x1A, 0x16, 0x64, 0xC1, 0xB1, 0x79, 0x22, 0x7C, 0x19, 0x4D, 0x34, 0xAC, 0x56, 0x98, 0x9E, 0x53, 0x6C,
	0x5E, 0x62, 0x77, 0x60, 0xA1, 0x86, 0x1C, 0x35, 0x67, 0x0D, 0x44, 0xEF, 0xB3, 0xFB, 0xF5, 0x92, 0x89, 0x55, 0x32,
	0x23, 0xEE, 0x1D, 0xFF, 0xA5, 0xE5, 0x59, 0x60, 0x1C, 0x72, 0x0D, 0x5A, 0x8C, 0x99, 0x3B, 0xF0, 0xFA, 0x5F, 0xE9,
	0x26, 0x69, 0xC7, 0x1A, 0x01, 0xDD, 0xD5, 0xD3, 0x84, 0x5B, 0x8E, 0x16, 0xB3, 0xE6, 0xF4, 0xE9, 0x92, 0x82, 0x0D,
	0x4F, 0x26, 0x33, 0xDD, 0x4D, 0x72, 0xFE, 0x66, 0xE6, 0x7A, 0xE5, 0xAE, 0x1E, 0x42, 0xEF, 0xB8, 0xF9, 0xCF, 0x1D,
	0x88, 0x7B, 0x24, 0x75, 0x23, 0xA9, 0x45, 0xFA, 0x8C, 0x86, 0x37, 0xB0, 0xC7, 0x17, 0xFD, 0x9B, 0xD8, 0x5E, 0x9B,
	0xC0, 0xC4, 0x61, 0x15, 0x22, 0x8E, 0x23, 0x6F, 0xC5, 0x3A, 0xA8, 0xAE, 0xCD, 0xF5, 0xD5, 0xDF, 0x49, 0x0D, 0xE9,
	0x5E, 0xB4, 0xF4, 0xEC, 0x2F, 0x11, 0xAF, 0xE4, 0x54, 0x65, 0x40, 0xD4, 0xD3, 0xB3, 0xAD, 0xC1, 0xAF, 0xFF, 0xFA,
	0xAD, 0xED, 0x4D, 0x29, 0x9E, 0x8F, 0xA2, 0x40, 0x98, 0x9B, 0x01, 0x42, 0x9D, 0x14, 0x6E, 0x33, 0xB3, 0xFF, 0xED,
	0x18, 0xDD, 0x5E, 0x83, 0xF4, 0x1F, 0x37, 0x33, 0xCB, 0x7E, 0x8E, 0x01, 0xA1, 0xFC, 0x65, 0xF1, 0x7B, 0xA0, 0xC2,
	0x08, 0x5C, 0x6B, 0xA8, 0x49, 0x48, 0x62, 0x1B, 0xB8, 0x43, 0x8A, 0x20, 0x5A, 0x52, 0xE6, 0xBA, 0x31, 0x78, 0x7B,
	0xED, 0x43, 0xB9, 0x4B, 0xBD, 0x94, 0x19, 0x5C, 0x2F, 0x26, 0x9D, 0xB2, 0x46, 0xFF, 0x48, 0x4F, 0x06, 0x22, 0x1E,
	0x39, 0x73, 0x94, 0x24, 0x73, 0x92, 0x57, 0x5D, 0x01, 0x66, 0x71, 0xCD, 0xE8, 0xF3, 0xE5, 0x78, 0x2A, 0x3D, 0xB8,
	0x63, 0xCD, 0x49, 0xEC, 0x91, 0xD5, 0x1A, 0x87, 0x06, 0x44, 0xB4, 0x8C, 0xC6, 0x20, 0x1C, 0x00, 0xD6, 0x6C, 0x55,
	0xE6, 0x39, 0x2D, 0x63, 0x42, 0xF3, 0x65, 0x4A, 0x18, 0x09, 0x1A, 0x0F, 0x6D, 0x7D, 0x4F, 0xB5, 0x43, 0x55, 0x09,
	0x40, 0xA0, 0x95, 0x4B, 0xB4, 0x88, 0x3F, 0x19, 0x16, 0xFD, 0x59, 0x77, 0x69, 0x05, 0xE6, 0x69, 0xB1, 0xA3, 0xEA,
	0xF4, 0xF2, 0xDC, 0x6A, 0x1B, 0x31, 0xB2, 0x69, 0xE2, 0x71, 0x2B, 0xEB, 0x4E, 0xB6, 0x4B, 0xF4, 0x62, 0x05, 0x14,
	0x89, 0x22, 0x61, 0x8C, 0xAD, 0x92, 0xCE, 0xB6, 0x64, 0xB7, 0x50, 0x96, 0xB3, 0x94, 0xEC, 0x31, 0x9C, 0x2D, 0xA5,
	0x89, 0x25, 0x86, 0x7F, 0xA4, 0x52, 0xA4, 0x7E, 0x86, 0x25, 0x8A, 0xA7, 0x31, 0xA4, 0x3C, 0xFD, 0xAB, 0xD2, 0xBF,
	0x84, 0xF7, 0xB3, 0x15, 0x40, 0x1A, 0x4C, 0x45, 0x36, 0x16, 0xA0, 0x50, 0x69, 0xF1, 0xB3, 0x3B, 0xDD, 0xAE, 0x89,
	0x0B, 0x97, 0x52, 0x27, 0xC3, 0x9A, 0xE0, 0x90, 0x68, 0xEA, 0x5C, 0xC8, 0xFC, 0x8B, 0xCA, 0xD3, 0x85, 0x81, 0x2E,
	0xB6, 0x06, 0xD1, 0x8D, 0x74, 0x84, 0x7E, 0xEA, 0x11, 0x01, 0x8D, 0x4A, 0x92, 0x83, 0x00, 0xAF, 0xF9, 0x0D, 0xDD,
	0x1F, 0x4C, 0xA4, 0x27, 0x9D, 0x8F, 0x4B, 0xE3, 0x2D, 0xC4, 0x06, 0x14, 0xD4, 0xF1, 0xD9, 0xBE, 0x95, 0x19, 0xC9,
	0xE5, 0x74, 0x41, 0xD8, 0x8D, 0x76, 0x6B, 0x0C, 0xBB, 0x9D, 0x69, 0x72, 0xEF, 0xDA, 0xF1, 0xB6, 0x6F, 0x27, 0xAA,
	0x8C, 0x22, 0x86, 0x97, 0xF7, 0x0B, 0xFD, 0xBD, 0xFB, 0x2E, 0x90, 0x1E, 0x9C, 0x8F, 0x41, 0xC0, 0xDF, 0x33, 0x16,
	0xA6, 0xC7, 0x1C, 0x12, 0xD5, 0x58, 0x51, 0x39, 0x50, 0x96, 0xD3, 0x90, 0x1B, 0x86, 0xA8, 0x19, 0x3A, 0x2B, 0xD2,
	0xDB, 0xB1, 0x89, 0x58, 0xD7, 0x85, 0xA5, 0x3B, 0x13, 0xB9, 0x81, 0x91, 0x52, 0x23, 0x2D, 0x58, 0x52, 0x8F, 0x43,
	0x69, 0xBF, 0xC7, 0xCA, 0x9C, 0xD1, 0xBE, 0x7E, 0xEE, 0xB0, 0x2B, 0x89, 0xB7, 0x68, 0x12, 0xEF, 0xFD, 0xFE, 0x78,
	0xB5, 0xC3, 0x75, 0x60, 0xDE, 0x0E, 0xD1, 0xCE, 0x6E, 0xE0, 0x16, 0xC6, 0x6A, 0x3F, 0x49, 0x4D, 0xD5, 0x2F, 0x6D,
	0x66, 0xB3, 0xB2, 0x86, 0x15, 0x08, 0xCE, 0x99, 0x5E, 0xD9, 0x86, 0xA8, 0x46, 0x28, 0xDE, 0xB9, 0xD0, 0xFC, 0xDB,
	0xD0, 0x00, 0x56, 0x80, 0xEF, 0xDA, 0x3C, 0xD1, 0x1C, 0x63, 0xB1, 0xD2, 0x5A, 0x9E, 0xB9, 0x88, 0xAD, 0x8F, 0x58,
	0xF6, 0x1A, 0x3B, 0x93, 0x20, 0xA4, 0xA5, 0x6D, 0x0A, 0x4F, 0xD1, 0xEA, 0xB9, 0x1F, 0xC3, 0x0F, 0x30, 0x19, 0x80,
	0xDE, 0x73, 0x40, 0x0B, 0x5D, 0x87, 0x98, 0x68, 0x90, 0x6E, 0x25, 0x9B, 0x79, 0x2E, 0xEC, 0xA9, 0x1E, 0xCB, 0xF0,
	0x95, 0x82, 0x47, 0x35, 0x63, 0xAA, 0xA8, 0xC0, 0x17, 0x98, 0xF1, 0x94, 0xB6, 0x52, 0x26, 0xB5, 0x43
};

Algorithme de cryptage

void ToggleEncryption (unsigned char *wda_data, int wda_data_size)
{
	// Algorithme de cryptage, version C. Parcourt tout le buffer wda_data sur wda_data_size
	// octets et masque ou démasque l'encryption des données sur celui-ci.

	register int i; // Variables register = internes au CPU, leur utilisation est plus rapide

	// Pour chaque octet de wda_data jusqu'à wda_data_size...
	for (i = 0; i < wda_data_size; i++)
		wda_data[i] ^= key[i % 3418]; // Ou exclusif avec la clé par blocs de 3418 octets

	return; // aussi simple que ça :)
}

Comment créer votre propre éditeur de PNJ ?

Il est possible de programmer un éditeur de PNJ qui travaille exclusivement sur le fichier NPCs.wda, mais cet éditeur ne saura modifier que la *logique interne* des PNJ ; il ne saura pas leur attribuer de créature associée. Il faudra donc vous attendre à développer un éditeur qui soit capable de lire et d'interpréter également le format des fichiers T4C Worlds et T4C Edit.

Dans cette section ne sera abordée que la manière de parcourir le fichier NPCs. Pour des informations de parcours des fichiers T4C Worlds et T4C Edit, reportez-vous à la page correspondante.

[TODO: pseudocode du parser]

Exemples d'éditeurs de PNJ :

  • les WDATools (auteur Sorkvild)
  • T4C Realm Editor (auteur Gustaf)
  • ...

--Sorkvild 14 mars 2008 à 04:57 (MSK)