mirror of
https://github.com/Nioux/AideDeJeu.git
synced 2025-10-30 15:06:06 +00:00
Clean
This commit is contained in:
parent
1d12abfbde
commit
22cbf187f6
7 changed files with 276 additions and 245 deletions
|
|
@ -25,85 +25,85 @@ namespace AideDeJeuLib
|
|||
// }
|
||||
//}
|
||||
|
||||
public void ParseBlock(Block block)
|
||||
{
|
||||
if (block is HeadingBlock)
|
||||
{
|
||||
var headingBlock = block as HeadingBlock;
|
||||
if (this.Name == null)
|
||||
{
|
||||
this.Name = headingBlock.Inline.ToMarkdownString();
|
||||
this.NameLevel = headingBlock.Level - 1;
|
||||
}
|
||||
this.Markdown += block.ToMarkdownString();
|
||||
}
|
||||
else if (block is ListBlock)
|
||||
{
|
||||
var listBlock = block as ListBlock;
|
||||
if (listBlock.BulletType == '-')
|
||||
{
|
||||
foreach (var inblock in listBlock)
|
||||
{
|
||||
if (inblock is Markdig.Syntax.ListItemBlock)
|
||||
{
|
||||
var listItemBlock = inblock as Markdig.Syntax.ListItemBlock;
|
||||
foreach (var ininblock in listItemBlock)
|
||||
{
|
||||
if (ininblock is Markdig.Syntax.ParagraphBlock)
|
||||
{
|
||||
var paragraphBlock = ininblock as Markdig.Syntax.ParagraphBlock;
|
||||
var str = paragraphBlock.ToMarkdownString();
|
||||
var regex = new Regex("(?<key>.*?): (?<value>.*)");
|
||||
var properties = new List<Tuple<string, Action<Generic, string>>>()
|
||||
{
|
||||
new Tuple<string, Action<Generic, string>>("AltName: ", (m, s) =>
|
||||
{
|
||||
this.Markdown += "- " + s; m.AltName = s;
|
||||
}),
|
||||
new Tuple<string, Action<Generic, string>>("", (m, s) =>
|
||||
{
|
||||
this.Markdown += "- " + str;
|
||||
}),
|
||||
};
|
||||
//public void ParseBlock(Block block)
|
||||
//{
|
||||
// if (block is HeadingBlock)
|
||||
// {
|
||||
// var headingBlock = block as HeadingBlock;
|
||||
// if (this.Name == null)
|
||||
// {
|
||||
// this.Name = headingBlock.Inline.ToMarkdownString();
|
||||
// this.NameLevel = headingBlock.Level - 1;
|
||||
// }
|
||||
// this.Markdown += block.ToMarkdownString();
|
||||
// }
|
||||
// else if (block is ListBlock)
|
||||
// {
|
||||
// var listBlock = block as ListBlock;
|
||||
// if (listBlock.BulletType == '-')
|
||||
// {
|
||||
// foreach (var inblock in listBlock)
|
||||
// {
|
||||
// if (inblock is Markdig.Syntax.ListItemBlock)
|
||||
// {
|
||||
// var listItemBlock = inblock as Markdig.Syntax.ListItemBlock;
|
||||
// foreach (var ininblock in listItemBlock)
|
||||
// {
|
||||
// if (ininblock is Markdig.Syntax.ParagraphBlock)
|
||||
// {
|
||||
// var paragraphBlock = ininblock as Markdig.Syntax.ParagraphBlock;
|
||||
// var str = paragraphBlock.ToMarkdownString();
|
||||
// var regex = new Regex("(?<key>.*?): (?<value>.*)");
|
||||
// var properties = new List<Tuple<string, Action<Generic, string>>>()
|
||||
// {
|
||||
// new Tuple<string, Action<Generic, string>>("AltName: ", (m, s) =>
|
||||
// {
|
||||
// this.Markdown += "- " + s; m.AltName = s;
|
||||
// }),
|
||||
// new Tuple<string, Action<Generic, string>>("", (m, s) =>
|
||||
// {
|
||||
// this.Markdown += "- " + str;
|
||||
// }),
|
||||
// };
|
||||
|
||||
foreach (var property in properties)
|
||||
{
|
||||
if (str.StartsWith(property.Item1))
|
||||
{
|
||||
property.Item2.Invoke(this, str.Substring(property.Item1.Length));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.Markdown += "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Markdown += block.ToMarkdownString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Markdown += block.ToMarkdownString();
|
||||
}
|
||||
}
|
||||
public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
{
|
||||
enumerator.MoveNext();
|
||||
while (enumerator.Current != null)
|
||||
{
|
||||
var block = enumerator.Current;
|
||||
if (block.IsNewItem())
|
||||
{
|
||||
return;
|
||||
}
|
||||
ParseBlock(block);
|
||||
enumerator.MoveNext();
|
||||
// foreach (var property in properties)
|
||||
// {
|
||||
// if (str.StartsWith(property.Item1))
|
||||
// {
|
||||
// property.Item2.Invoke(this, str.Substring(property.Item1.Length));
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// this.Markdown += "\n";
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.Markdown += block.ToMarkdownString();
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.Markdown += block.ToMarkdownString();
|
||||
// }
|
||||
//}
|
||||
//public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
//{
|
||||
// enumerator.MoveNext();
|
||||
// while (enumerator.Current != null)
|
||||
// {
|
||||
// var block = enumerator.Current;
|
||||
// if (block.IsNewItem())
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
// ParseBlock(block);
|
||||
// enumerator.MoveNext();
|
||||
|
||||
}
|
||||
}
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,20 +152,20 @@ namespace AideDeJeuLib
|
|||
}
|
||||
}
|
||||
|
||||
public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
{
|
||||
enumerator.MoveNext();
|
||||
while (enumerator.Current != null)
|
||||
{
|
||||
var block = enumerator.Current;
|
||||
if (block.IsNewItem())
|
||||
{
|
||||
return;
|
||||
}
|
||||
ParseBlock(block);
|
||||
enumerator.MoveNext();
|
||||
//public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
//{
|
||||
// enumerator.MoveNext();
|
||||
// while (enumerator.Current != null)
|
||||
// {
|
||||
// var block = enumerator.Current;
|
||||
// if (block.IsNewItem())
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
// ParseBlock(block);
|
||||
// enumerator.MoveNext();
|
||||
|
||||
}
|
||||
}
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ namespace AideDeJeuLib
|
|||
}
|
||||
}
|
||||
|
||||
public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
{
|
||||
//public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
//{
|
||||
|
||||
}
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,9 @@ namespace AideDeJeuLib
|
|||
}
|
||||
}
|
||||
|
||||
public string Source { get; set; }
|
||||
|
||||
public string Markdown { get; set; }
|
||||
public virtual void Parse(ref Markdig.Syntax.ContainerBlock.Enumerator enumerator) { }
|
||||
//public virtual void Parse(ref Markdig.Syntax.ContainerBlock.Enumerator enumerator) { }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,24 +69,24 @@ namespace AideDeJeuLib
|
|||
}
|
||||
}
|
||||
|
||||
public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
{
|
||||
var items = new List<Item>();
|
||||
enumerator.MoveNext();
|
||||
ParseHeader(ref enumerator);
|
||||
while (enumerator.Current != null)
|
||||
{
|
||||
var block = enumerator.Current;
|
||||
if (block.IsClosingItem())
|
||||
{
|
||||
break;
|
||||
}
|
||||
var item = block.GetNewItem();
|
||||
item.Parse(ref enumerator);
|
||||
items.Add(item);
|
||||
}
|
||||
_Items = items;
|
||||
}
|
||||
//public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
//{
|
||||
// var items = new List<Item>();
|
||||
// enumerator.MoveNext();
|
||||
// ParseHeader(ref enumerator);
|
||||
// while (enumerator.Current != null)
|
||||
// {
|
||||
// var block = enumerator.Current;
|
||||
// if (block.IsClosingItem())
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
// var item = block.GetNewItem();
|
||||
// item.Parse(ref enumerator);
|
||||
// items.Add(item);
|
||||
// }
|
||||
// _Items = items;
|
||||
//}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -37,57 +37,57 @@ namespace AideDeJeuLib
|
|||
// }
|
||||
//}
|
||||
|
||||
public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
{
|
||||
enumerator.MoveNext();
|
||||
while (enumerator.Current != null)
|
||||
{
|
||||
var block = enumerator.Current;
|
||||
if (block is HeadingBlock)
|
||||
{
|
||||
var headingBlock = block as HeadingBlock;
|
||||
if (headingBlock.HeaderChar == '#' && (headingBlock.Level == 1 || headingBlock.Level == 2))
|
||||
{
|
||||
if (this.NameLink == null)
|
||||
{
|
||||
this.NameLink = headingBlock.Inline.ToMarkdownString();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (block is ParagraphBlock)
|
||||
{
|
||||
if (block.IsNewItem())
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (block is ListBlock)
|
||||
{
|
||||
var listBlock = block as ListBlock;
|
||||
if (listBlock.BulletType == '-')
|
||||
{
|
||||
var regex = new Regex("(?<key>.*?): (?<value>.*)");
|
||||
var str = block.ToMarkdownString();
|
||||
var properties = new List<Tuple<string, Action<LinkItem, string>>>()
|
||||
{
|
||||
new Tuple<string, Action<LinkItem, string>>("- AltName: ", (m, s) =>
|
||||
{
|
||||
m.AltName = s;
|
||||
})
|
||||
};
|
||||
//public override void Parse(ref ContainerBlock.Enumerator enumerator)
|
||||
//{
|
||||
// enumerator.MoveNext();
|
||||
// while (enumerator.Current != null)
|
||||
// {
|
||||
// var block = enumerator.Current;
|
||||
// if (block is HeadingBlock)
|
||||
// {
|
||||
// var headingBlock = block as HeadingBlock;
|
||||
// if (headingBlock.HeaderChar == '#' && (headingBlock.Level == 1 || headingBlock.Level == 2))
|
||||
// {
|
||||
// if (this.NameLink == null)
|
||||
// {
|
||||
// this.NameLink = headingBlock.Inline.ToMarkdownString();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// else if (block is ParagraphBlock)
|
||||
// {
|
||||
// if (block.IsNewItem())
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// else if (block is ListBlock)
|
||||
// {
|
||||
// var listBlock = block as ListBlock;
|
||||
// if (listBlock.BulletType == '-')
|
||||
// {
|
||||
// var regex = new Regex("(?<key>.*?): (?<value>.*)");
|
||||
// var str = block.ToMarkdownString();
|
||||
// var properties = new List<Tuple<string, Action<LinkItem, string>>>()
|
||||
// {
|
||||
// new Tuple<string, Action<LinkItem, string>>("- AltName: ", (m, s) =>
|
||||
// {
|
||||
// m.AltName = s;
|
||||
// })
|
||||
// };
|
||||
|
||||
foreach (var property in properties)
|
||||
{
|
||||
if (str.StartsWith(property.Item1))
|
||||
{
|
||||
property.Item2.Invoke(this, str.Substring(property.Item1.Length));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
enumerator.MoveNext();
|
||||
}
|
||||
}
|
||||
// foreach (var property in properties)
|
||||
// {
|
||||
// if (str.StartsWith(property.Item1))
|
||||
// {
|
||||
// property.Item2.Invoke(this, str.Substring(property.Item1.Length));
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// enumerator.MoveNext();
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
189
Data/races_hd.md
189
Data/races_hd.md
|
|
@ -1,152 +1,185 @@
|
|||
[][Items]
|
||||
|
||||
<Items>
|
||||
|
||||
<Header>
|
||||
# <Name>Races</Name>
|
||||
|
||||
# Races
|
||||
|
||||
- AltName: <AltName>Races</AltName> (SRD p3)
|
||||
- Source: (MDR p36)
|
||||
|
||||
</Header>
|
||||
|
||||
[][Generic]
|
||||
- <AltName>Races</AltName>
|
||||
- Source: <Source>(MDR p36)(SRD p3)</Source>
|
||||
|
||||
<Generic>
|
||||
|
||||
### Traits raciaux
|
||||
### <Name>Traits raciaux</Name>
|
||||
|
||||
- AltName: Racial Traits (SRD p3)
|
||||
- Source: (MDR p36)
|
||||
- <AltName>Racial Traits</AltName>
|
||||
- Source: <Source>(MDR p36)(SRD p3)</Source>
|
||||
|
||||
Chaque race possède des traits raciaux communs à tous ses membres. Vous pourrez trouver la terminologie suivante parmi les traits de la plupart des races.
|
||||
|
||||
</Generic>
|
||||
|
||||
[][Generic]
|
||||
<Generic>
|
||||
|
||||
#### Augmentation de caractéristiques
|
||||
#### <Name>Augmentation de caractéristiques</Name>
|
||||
|
||||
- AltName: Ability Score Increase (SRD p3)
|
||||
- Source: (MDR p36)
|
||||
- <AltName>Ability Score Increase</AltName>
|
||||
- Source: <Source>(MDR p36)(SRD p3)</Source>
|
||||
|
||||
Chaque race accorde un bonus à une ou plusieurs caractéristiques du personnage.
|
||||
|
||||
[][Generic]
|
||||
</Generic>
|
||||
|
||||
#### Âge
|
||||
<Generic>
|
||||
|
||||
- AltName: Age (SRD p3)
|
||||
- Source: (MDR p36)
|
||||
#### <Name>Âge</Name>
|
||||
|
||||
- <AltName>Age</AltName>
|
||||
- Source: <Source>(MDR p36)(SRD p3)</Source>
|
||||
|
||||
Cette entrée indique l’âge à partir duquel un individu est considéré comme un adulte ainsi que la longévité moyenne des représentants de cette race. Cette information peut vous aider à choisir l’âge de votre personnage au début du jeu. Vous êtes libre de lui donner l’âge de votre choix. Ce dernier peut expliquer la répartition de vos valeurs de caractéristiques. Par exemple, si vous jouez un personnage jeune ou très vieux, votre âge pourra expliquer des valeurs de Force et Constitution particulièrement basses, et un âge avancé pourra justifier de bonnes valeurs d’Intelligence et de Sagesse.
|
||||
|
||||
[][Generic]
|
||||
</Generic>
|
||||
|
||||
#### Alignement
|
||||
<Generic>
|
||||
|
||||
- AltName: Alignment (SRD p3)
|
||||
- Source: (MDR p36)
|
||||
#### <Name>Alignement</Name>
|
||||
|
||||
- <AltName>Alignment</AltName>
|
||||
- Source: <Source>(MDR p36)(SRD p3)</Source>
|
||||
|
||||
La plupart des races tendent naturellement vers un alignement donné, mentionné dans cette entrée. L’alignement est indiqué à titre informatif et les joueurs ne sont pas obligés de l’adopter, mais si vous vous demandez pourquoi votre nain est d’alignement Chaotique, en rébellion par rapport à une société naine plutôt Loyale, par exemple, cela peut vous aider à mieux déterminer son comportement.
|
||||
|
||||
[][Generic]
|
||||
</Generic>
|
||||
|
||||
#### Taille
|
||||
<Generic>
|
||||
|
||||
- AltName: Size (SRD p3)
|
||||
- Source: (MDR p37)
|
||||
#### <Name>Taille</Name>
|
||||
|
||||
- <AltName>Size</AltName>
|
||||
- Source: <Source>(MDR p37)(SRD p3)</Source>
|
||||
|
||||
Les personnages de la plupart des races sont de taille moyenne, une catégorie qui regroupe les créatures qui se situent entre 1,20 mètre et 2,40 mètres. Les membres de certaines races sont de taille petite (60 centimètres à 1,20 mètre), ce qui signifie que certaines règles du jeu ne les affecteront pas de la même manière que les autres. La règle la plus importante pour les petites créatures est qu’elles ont des difficultés à manier les armes lourdes, comme cela est expliqué au chapitre 5, Équipement, page 227.
|
||||
|
||||
[][Generic]
|
||||
</Generic>
|
||||
|
||||
#### Vitesse
|
||||
<Generic>
|
||||
|
||||
- AltName: Speed (SRD p3)
|
||||
- Source: (MDR p37)
|
||||
#### <Name>Vitesse</Name>
|
||||
|
||||
- <AltName>Speed</AltName>
|
||||
- Source: <Source>(MDR p37)(SRD p3)</Source>
|
||||
|
||||
Votre vitesse correspond à la distance que vous pouvez parcourir quand vous voyagez (voir le chapitre 8, Partir à l’aventure, pages 269-281) ou quand vous combattez (voir le chapitre 9, Combattre, pages 282-295).
|
||||
|
||||
[][Generic]
|
||||
</Generic>
|
||||
|
||||
#### Langues
|
||||
<Generic>
|
||||
|
||||
- AltName: Languages (SRD p3)
|
||||
- Source: (MDR p37)
|
||||
#### <Name>Langues</Name>
|
||||
|
||||
- <AltName>Languages</AltName>
|
||||
- Source: <Source>(MDR p37)(SRD p3)</Source>
|
||||
|
||||
Le fait d’appartenir à une race donnée vous permet de parler, lire et écrire certaines langues.
|
||||
|
||||
[][Generic]
|
||||
</Generic>
|
||||
|
||||
#### Peuples
|
||||
<Generic>
|
||||
|
||||
- AltName: Subraces (SRD p3)
|
||||
- Source: (MDR p37)
|
||||
#### <Name>Peuples</Name>
|
||||
|
||||
- <AltName>Subraces</AltName>
|
||||
- Source: <Source>(MDR p37)(SRD p3)</Source>
|
||||
|
||||
Certaines races se divisent en plusieurs peuples avec des différences culturelles et parfois physiques. Les membres de chaque peuple possèdent les traits de la race dont ils sont issus, ainsi que ceux du peuple auquel ils appartiennent. Les relations entre les diverses populations d’une même race peuvent varier énormément d’une race ou d’un monde à l’autre.
|
||||
|
||||
[][LinkItem]
|
||||
</Generic>
|
||||
|
||||
## [Demi-elfe]
|
||||
- AltName: [Half-Elf](#)
|
||||
<LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
## <NameLink>[Demi-elfe]</NameLink>
|
||||
- <AltName>[Half-Elf](#)</AltName>
|
||||
|
||||
## [Demi-orc]
|
||||
- AltName: [Half-Orc](#)
|
||||
</LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
<LinkItem>
|
||||
|
||||
## [Elfe]
|
||||
- AltName: [Elf](#)
|
||||
## <NameLink>[Demi-orc]</NameLink>
|
||||
- <AltName>[Half-Orc](#)</AltName>
|
||||
|
||||
[][LinkItem]
|
||||
</LinkItem>
|
||||
|
||||
## [Gnome]
|
||||
- AltName: [Gnome](#)
|
||||
<LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
## <NameLink>[Elfe]</NameLink>
|
||||
- <AltName>[Elf](#)</AltName>
|
||||
|
||||
## [Halfelin]
|
||||
- AltName: [Halfling](#)
|
||||
</LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
<LinkItem>
|
||||
|
||||
## [Humain]
|
||||
- AltName: [Human](#)
|
||||
## <NameLink>[Gnome]</NameLink>
|
||||
- <AltName>[Gnome](#)</AltName>
|
||||
|
||||
[][LinkItem]
|
||||
</LinkItem>
|
||||
|
||||
## [Nain]
|
||||
- AltName: [Dwarf](#)
|
||||
<LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
## <NameLink>[Halfelin]</NameLink>
|
||||
- <AltName>[Halfling](#)</AltName>
|
||||
|
||||
## [Aasimar]
|
||||
</LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
<LinkItem>
|
||||
|
||||
## [Demi-ogre]
|
||||
## <NameLink>[Humain]</NameLink>
|
||||
- <AltName>[Human](#)</AltName>
|
||||
|
||||
[][LinkItem]
|
||||
</LinkItem>
|
||||
|
||||
## [Félys]
|
||||
<LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
## <NameLink>[Nain]</NameLink>
|
||||
- <AltName>[Dwarf](#)</AltName>
|
||||
|
||||
## [Homme serpent]
|
||||
</LinkItem>
|
||||
|
||||
[][LinkItem]
|
||||
<LinkItem>
|
||||
|
||||
## [Sangdragon]
|
||||
- AltName: [Dragonborn](#)
|
||||
## <NameLink>[Aasimar]</NameLink>
|
||||
|
||||
[][LinkItem]
|
||||
</LinkItem>
|
||||
|
||||
## [Tieffelin]
|
||||
- AltName: [Tiefling](#)
|
||||
<LinkItem>
|
||||
|
||||
## <NameLink>[Demi-ogre]</NameLink>
|
||||
|
||||
</LinkItem>
|
||||
|
||||
<LinkItem>
|
||||
|
||||
## <NameLink>[Félys]</NameLink>
|
||||
|
||||
</LinkItem>
|
||||
|
||||
<LinkItem>
|
||||
|
||||
## <NameLink>[Homme serpent]</NameLink>
|
||||
|
||||
</LinkItem>
|
||||
|
||||
<LinkItem>
|
||||
|
||||
## <NameLink>[Sangdragon]</NameLink>
|
||||
- <AltName>[Dragonborn](#)</AltName>
|
||||
|
||||
</LinkItem>
|
||||
|
||||
<LinkItem>
|
||||
|
||||
## <NameLink>[Tieffelin]</NameLink>
|
||||
- <AltName>[Tiefling](#)</AltName>
|
||||
|
||||
</LinkItem>
|
||||
|
||||
</Items>
|
||||
|
||||
|
|
@ -163,7 +196,3 @@ Certaines races se divisent en plusieurs peuples avec des différences culturell
|
|||
[Homme serpent]: homme-serpent_hd.md
|
||||
[Sangdragon]: dragonborn_hd.md
|
||||
[Tieffelin]: tiefling_hd.md
|
||||
|
||||
[Items]: #
|
||||
[LinkItem]: #
|
||||
[Generic]: #
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue