private SetupCode GenerateSetupCode(string account, string secretKey, int qRPixelsPerModule = 0, string issuer = null)
        {
            if (account == null)
            {
                throw new NullReferenceException("Account is null");
            }
            account = account.Replace(" ", "");
            string encodedSecretKey = Base32String.Base32Encode(secretKey);
            string provisionUrl     = null;

            if (String.IsNullOrWhiteSpace(issuer))
            {
                provisionUrl = String.Format("otpauth://totp/{0}?secret={1}", account, encodedSecretKey);
            }
            else
            {
                //  https://github.com/google/google-authenticator/wiki/Conflicting-Accounts
                // Added additional prefix to account otpauth://totp/Company:[email protected] for backwards compatibility
                provisionUrl = String.Format("otpauth://totp/{2}:{0}?secret={1}&issuer={2}", account, encodedSecretKey, UrlEncode(issuer));
            }
            var setupCode = new SetupCode();

            setupCode.Account          = account;
            setupCode.QrCodeContent    = provisionUrl;
            setupCode.Issuer           = issuer;
            setupCode.SecretKey        = secretKey;
            setupCode.EncodedSecretKey = encodedSecretKey;
            if (qRPixelsPerModule > 0)
            {
                using (QRCodeGenerator qrGenerator = new QRCodeGenerator())
                    using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(provisionUrl, QRCodeGenerator.ECCLevel.Q))
                        using (QRCode qrCode = new QRCode(qrCodeData))
                            using (Bitmap qrCodeImage = qrCode.GetGraphic(qRPixelsPerModule))
                                using (MemoryStream ms = new MemoryStream())
                                {
                                    qrCodeImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                                    setupCode.QrCodeImageBase64    = Convert.ToBase64String(ms.ToArray());
                                    setupCode.QrCodeImageBase64Url = "data:image/png;base64," + setupCode.QrCodeImageBase64;
                                }
            }
            return(setupCode);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="account">Account</param>
        /// <param name="secretKey">Account Secret Key</param>
        /// <param name="secretIsBase32">Flag saying if accountSecretKey is in Base32 format or original secret</param>
        /// <param name="qRPixelsPerModule">Number of pixels per QR Module (2 pixels give ~ 100x100px QRCode)</param>
        /// <param name="issuer"></param>
        /// <returns></returns>
        public SetupCode GenerateSetupCode(string account, string secretKey, bool secretIsBase32, int qRPixelsPerModule = 0, string issuer = null)
        {
            secretKey = secretIsBase32 ? Base32String.Base32Decode(secretKey) : secretKey;

            return(GenerateSetupCode(account, secretKey, qRPixelsPerModule, issuer));
        }