using System.Collections.Generic;
using System.Runtime.Serialization;
public sealed class NamePatternAggregate
public Dictionary<string, NamePattern> Markets { get; set; }
public Dictionary<string, NamePattern> Selections { get; set; }
public Dictionary<string, NamePattern> Events { get; set; }
public string Pattern { get; set; }
public NamePatternType Type { get; set; }
public Dictionary<string, string> Parameters { get; set; }
public enum NamePatternType
public static class NamePatternDecoder
public static NamePatternAggregate Decode(string base64String)
if (base64String is null)
throw new ArgumentNullException(nameof(base64String));
var data = Convert.FromBase64String(base64String);
return MessagePackSerializer.Deserialize<NamePatternAggregate>( data, MessagePackOptions.Lz4Options );
internal static class MessagePackOptions
public static MessagePackSerializerOptions Lz4Options { get; } =
MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray);
public static class NamePatternEncoder
public static string Encode(
Dictionary<string, NamePattern> markets = null,
Dictionary<string, NamePattern> selections = null,
Dictionary<string, NamePattern> events = null)
if (markets is null && selections is null && events is null)
throw new ArgumentNullException(null, "One of parameters should be not null");
var aggregate = new NamePatternAggregate
var bytes = MessagePackSerializer.Serialize(aggregate, MessagePackOptions.Lz4Options );
return Convert.ToBase64String(bytes);
public static void Main()
var betSlipLinePattern = "kscDYs0BVMYAAAEA8BmTgag2MTI1NjU3NpOjezB9AIKuUGhyYXNlQ2xhc3N7MH2mMyw4LDEwHAD0AKhPdXRSaWdodILZJjBRQTgA/BAjNzEyNTQxMzk2XzRMNDA2ODVRMTI0MFEyLTGTo3syUwBwMn2kMiwxOBoAtqhNYW4gQ2l0edklUAASNVAAPDMxNFAA+wUxk7F7Mn0gKEUvVyAxLzIgMS0yKbAAD10AAfIYgdkkNGMxMTJiMGEtOTZhNy00NjY2LWRiODgtMDhkOWM0ODJiYThl/wA5g65w/wBCojEwrRIAQlR5cGURAAAMAfANu0NvbXBldGl0aW9uUGxheWVyUHJvcHMgVGVzdA==";
var aggregate = NamePatternDecoder.Decode(betSlipLinePattern);
foreach (var selection in aggregate.Selections)
Console.WriteLine(selection.Key + "\t" + selection.Value.Pattern);
foreach (var p in selection.Value.Parameters)
Console.WriteLine("\t" + p.Key + ":" + p.Value);
foreach (var market in aggregate.Markets)
Console.WriteLine(market.Key + "\t" + market.Value.Pattern);
foreach (var p in market.Value.Parameters)
Console.WriteLine("\t" + p.Key + ":" + p.Value);
foreach (var eventId in aggregate.Events)
Console.WriteLine(eventId.Key + "\t" + eventId.Value.Pattern);
foreach (var p in eventId.Value.Parameters)
Console.WriteLine("\t" + p.Key + ":" + p.Value);