public Protocol Track(ParameterTextValue hitType)
        {
            var userId = Guid.NewGuid().ToString();

            this.WithParameters(
                Parameter.Text(ParameterName.ClientId, new ParameterTextValue(userId, ASCIIEncoding.Unicode.GetByteCount(userId))),
                Parameter.Text(ParameterName.UserId, new ParameterTextValue(userId, ASCIIEncoding.Unicode.GetByteCount(userId))),
                Parameter.Text(ParameterName.HitType, hitType)
                );
            this.parameterSets.Add(this.trackingParameters.ToDictionary(p => p.Name, p => p));
            return(this);
        }
        protected Protocol(string url, string trackingId)
        {
            this.baseUrl    = new Uri(url);
            this.trackingId = Parameter.Text(ParameterName.TrackingId, new TrackingIdValue(trackingId));

            this.trackingParameters = new Parameter[] {
                this.version,
                this.trackingId,
                Parameter.Boolean(ParameterName.HitNonInteractive, ParameterBooleanValue.True),
                Parameter.Text(ParameterName.UserAgentOverride, new ParameterTextValue(ParameterName.UserAgentOverride, ASCIIEncoding.Unicode.GetByteCount(userAgent)))
            };

            this.parameterSets = new List <Dictionary <string, Parameter> >(
                new Dictionary <string, Parameter>[] {
                this.trackingParameters.ToDictionary(p => p.Name, p => p)
            });
        }