JoreNoe 7.0.0.2
See the version list below for details.
dotnet add package JoreNoe --version 7.0.0.2
NuGet\Install-Package JoreNoe -Version 7.0.0.2
<PackageReference Include="JoreNoe" Version="7.0.0.2" />
paket add JoreNoe --version 7.0.0.2
#r "nuget: JoreNoe, 7.0.0.2"
// Install JoreNoe as a Cake Addin #addin nuget:?package=JoreNoe&version=7.0.0.2 // Install JoreNoe as a Cake Tool #tool nuget:?package=JoreNoe&version=7.0.0.2
JoreNoe
安装方法
Build | NuGet | Downloads |
---|---|---|
<a href="https://www.nuget.org/packages/JoreNoe/" rel="nofollow noreferrer"><img src="https://img.shields.io/nuget/dt/JoreNoe?label=Downloads" alt="NuGet Downloads"></a> |
Install-Package JoreNoe -Version 6.9.9.4
文档目录
ORM使用
Redis使用
发送消息
帮助扩展方法
中间件使用
ORM使用说明
JoreNoe包目前支持数据库:Mysql , SqlServer
支持,ORM框架 Dapper,EFCore
<a name="OPT1-1"></a>
1.Dapper 使用
首先第一步引用
using JoreNoe.DB.Dapper
第二步进行注册
在您的应用程序启动时,将服务添加到依赖注入容器中。您可以在 Startup.cs 文件中的 ConfigureServices 方法中调用 AddJoreNoeDapper 方法来注册服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddJoreNoeDapper("your_connection_string_here", IDBType.SqlServer);
// 或者
// services.AddJoreNoeDapper("your_connection_string_here", IDBType.MySql);
}
第三步使用服务
public class YourService
{
private readonly IRepository<test> TestRepository;
public YourService(IRepository<test> TestRepository)
{
this.TestRepository = TestRepository;
}
public void YourMethod()
{
this.TestRepository.Add(new ...);
}
}
属性获取
public class YourService
{
private readonly IDatabaseService dataBaseService;
public YourService(IDatabaseService dataBaseService)
{
this.dataBaseService = dataBaseService;
}
public IDbConnection GetConnection()
{
this.dataBaseService.GetConnection();
}
public string GetPropValue()
{
return this.dataBaseService.DataBaseSettings.connectionString; // 返回链接字符串
return this.dataBaseService.DataBaseSettings.dbType; // 返回数据库类型
return this.dataBaseService.DataBaseSettings.mulitInsertBatchcount; // 返回批量插入 一批次数量
}
}
不使用注入方式
public class UserController
{
var database = new Repository<test>(new DatabaseService("your_connection_string_here",默认Mysql,默认20万));
database.add(new test{...});
}
<a name="OPT1-2"></a>
2.EntityFramework.Core使用
首先第一步引用
1.在仓储项目中创建
1.1 RepositoryModule.cs
1.2 IntegratedPlatformSupporRegister.cs 名字可随意
2.创建上下文
2.1 IntegratedPlatformSupporDBContext.cs 名字随意
第二步具体代码实现
1.1.RepositoryModule.cs 文件 具体代码实现
using Autofac;
using JoreNoe;
using JoreNoe.DB.EntityFrameWork.Core.SqlServer;
namespace IntegratedPlatformSuppor.Repository
{
public class RepositoryModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<IntegratedPlatformSupporRegister>().As<ICurrencyRegister>().InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();
}
}
}
1.2.IntegratedPlatformSupporRegister.cs 文件具体代码实现
using JoreNoe;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
namespace IntegratedPlatformSuppor.Repository
{
public class IntegratedPlatformSupporRegister : ICurrencyRegister, IDisposable
{
private DbContext _dbContext;
public IntegratedPlatformSupporRegister(IConfiguration Configuration)
{
this._dbContext = new IntegratedPlatformSupporDBContext { Configuration = Configuration };
}
public DbContext Dbcontext { get => this._dbContext; set { this._dbContext = value; } }
public void Dispose()
{
this._dbContext.Dispose();
}
}
}
2.1.IntegratedPlatformSupporDBContext.cs 文件具体代码实现
using IntegratedPlatformSuppor.Domain.Entity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
namespace IntegratedPlatformSuppor.Repository
{
public class IntegratedPlatformSupporDBContext : DbContext
{
public IntegratedPlatformSupporDBContext()
{
//this.Configuration = configuration;
//如果要访问的数据库存在,则不做操作,如果不存在,会自动创建所有数据表和模式
//Database.EnsureCreated();
}
/// <summary>
/// 配置
/// </summary>
public IConfiguration Configuration { set; get; }
/// <summary>
/// 用户
/// </summary>
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!string.IsNullOrEmpty(this.Configuration.GetConnectionString("DbConnect")))
optionsBuilder.UseSqlServer(this.Configuration.GetConnectionString("DbConnect"));
else
optionsBuilder.UseSqlServer("Server=47.106.198.147;Database=IntegratedPlatformSuppor;Uid=sa;Password=JoreNoe123$%^");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Test>().HasQueryFilter(t => t.IsDelete == false);
modelBuilder.Entity<User>().HasQueryFilter(t => t.IsDelete == false);
modelBuilder.Entity<MeansCategory>().HasQueryFilter(d => !d.IsDelete); //.HasQueryFilter(t => t.IsDelete == false);
}
}
}
进行注册
1.使用AutoFac
在项目中创建Autofac.json 文件 写入配置如下 根据实际情况进行自行调整
{
"modules": [
{ "type": "IntegratedPlatformSuppor.Repository.RepositoryModule,IntegratedPlatformSuppor.Repository" },
{ "type": "IntegratedPlatformSuppor.API.APIModule,IntegratedPlatformSuppor.API" },
{ "type": "IntegratedPlatformSuppor.DomainService.DomainServiceModule,IntegratedPlatformSuppor.DomainService" }
//{ "type": "JoreNoe.Modules.JoreNoeModule,JoreNoe" }
]
}
2.WebApi 项目中 Program.cs 文件中写入
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System.IO;
namespace IntegratedPlatformSuppor.API
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureAppConfiguration((appConfiguration, builder) =>
{
builder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("Configs/Redis.json", optional: false, reloadOnChange: true)
.AddJsonFile("Configs/Exceptionless.json", optional: false, reloadOnChange: true)
.AddJsonFile("Configs/WeChatOpenConfig.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables().Build();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.UseUrls("http://*:5000");
});
}
}
3.StartUp.cs 中加入
public void ConfigureContainer(ContainerBuilder builder)
{
var config = new ConfigurationBuilder();
config.AddJsonFile("./Configs/Autofac.json");
builder.RegisterModule(new ConfigurationModule(config.Build()));
}
实战使用
public class testDomainService :BaseRepository ,ItestDomainService
{
private readonly IRepository<Guid, Test> test;
public testDomainService(
IRepository<Guid, Test> test,
IUnitOfWork Unit):base(Unit)
{
this.test = test;
}
public TestValue k()
{
var xss = this.test.Single(Guid.NewGuid());
return null;
}
}
<a name="OPT2"></a>
3.Redis 使用说明
如何使用
1.注入 JoreNoe Redis 中注册上下文
public void ConfigureServices(IServiceCollection services)
{
services.AddJoreNoeRedis("your_connection_string_here", "InstanceName",DefaultDB=0);
}
2.如何使用Redis
using JoreNoe.Cache.Redis;
public class RedisTest
{
private readonly JoreNoe.Cache.Redis.IRedisManager ReadisManager;
public RedisTest(JoreNoe.Cache.Redis.IRedisManager ReadisManager) {
this.ReadisManager = ReadisManager;
}
public void test()
{
this.ReadisManager.Add("Test", "test", JoreNoe.Cache.Redis.ExpireModel.LongCache);
Console.WriteLine(this.ReadisManager.Get("Test"));
}
}
3.直接调用
JoreNoe.Cache.Redis.JoreNoeRedisBaseService RedisDataBase = new JoreNoe.Cache.Redis.JoreNoeRedisBaseService(new JoreNoe.Cache.Redis.SettingConfigs {
ConnectionString= "localhost:6379,password=mima",
DefaultDB=1,
InstanceName="TestRedis"
});
JoreNoe.Cache.Redis.IRedisManager RedisManager = new JoreNoe.Cache.Redis.RedisManager(RedisDataBase);
RedisManager.Add("Test","test", JoreNoe.Cache.Redis.ExpireModel.LongCache);
Console.WriteLine(RedisManager.Get("Test"));
Console.ReadLine();
<a name="OPT3"></a>
发送消息
目前支持:email 发送
1.邮箱发送
如何使用
using JoreNoe.Message;
public class test{
public void sendtest(){
// 首先注册
var EmailHelper = new EmailMessageAPI(发送者,SMTP地址,SMTP端口,密码(个人是授权码),是否开启SSL认证);
EmailHelper.Send(收件人,标题,主题内容,是否开启兼容HTML);
}
}
<a name="OPT4"></a>
帮助扩展方法
支持:boolean,字典转SQL,映射,实体转字典
1.bool 扩展方法
using JoreNoe.Extend;
public class test{
public void sendtest(){
/// <summary>
/// 可用枚举类型 默认 1
/// 类型1:IsOrDeny 是 否
/// 类型2:TrueOrFalse 真 假
/// 类型3:OnOrOff 开 关
/// 类型4:EnableOrDisable 启用 关闭
/// </summary>
var booltest = false;
var REsult = booltest.BooleanToString(AvailableType.IsOrDeny);
// 输出 否
}
}
2.映射(AutoMapper)
// 直接使用方式
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<test, test1>();
cfg.CreateMap<test1, test>();
});
var mapper = new Mapper(config);
JoreNoe.Extend.JoreNoeObjectToObjectExtension.UseJoreNoeObjectToOBject(mapper);
var test = new test() {
name = "c",
age=123
};
var test1 = new test1();
// 将 test 数据 给 test1
var ment = test.Map(test1);
Console.ReadLine();
// NET 使用方式
// StartUp
public partial class Startup
{
protected void AddAutoMapper(IServiceCollection services)
{
services.TryAddSingleton<MapperConfigurationExpression>();
services.TryAddSingleton(serviceProvider =>
{
var mapperConfigurationExpression = serviceProvider.GetRequiredService<MapperConfigurationExpression>();
var instance = new MapperConfiguration(mapperConfigurationExpression);
instance.AssertConfigurationIsValid();
return instance;
});
services.TryAddSingleton(serviceProvider =>
{
var mapperConfiguration = serviceProvider.GetRequiredService<MapperConfiguration>();
return mapperConfiguration.CreateMapper();
});
}
public void UseAutoMapper(IApplicationBuilder applicationBuilder)
{
var config = applicationBuilder.ApplicationServices.GetRequiredService<MapperConfigurationExpression>();
//订单
config.CreateMap<OrderModel, Order>(MemberList.None);
config.CreateMap<Order, OrderValue>(MemberList.None);
//config.CreateMap<User, UserInfo>().ForMember(d => d.names, option => option.MapFrom(d => d.name)).ReverseMap();
}
// Program
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureAppConfiguration((appConfiguration, builder) =>
{
builder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("Configs/Redis.json", optional: false, reloadOnChange: true)
.AddJsonFile("Configs/Exceptionless.json", optional: false, reloadOnChange: true)
.AddJsonFile("Configs/WeChatOpenConfig.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables().Build();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.UseUrls("http://*:5000");
});
// StartUp Configure 中
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment() || env.IsProduction())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ZerroMovies.API v1"));
}
app.UseObjectToOBjectExtension();
}
<a name="OPT5"></a>
中间件的使用
1.全局错误日志中间件
// 使用方式1 webapi 全局错误日志中间件 直接使用方式
app.UseJoreNoeGlobalErrorHandlingMiddleware(async (ex, context) =>
{
// 返回错误信息 // 处理自己的数据
await Console.Out.WriteLineAsync(ex.Message);
});
// 使用方式2 注入 自定义类继承使用方式
builder.Services.AddJoreNoeGlobalErrorHandlingMiddleware<TestErrorMiddleWare>();
app.UseJoreNoeGlobalErrorHandlingMiddleware();
// 使用案例
using JoreNoe.Middleware;
namespace TestNET6Project
{
public class TestErrorMiddleWare : IJoreNoeGlobalErrorHandling
{
public async Task GlobalErrorHandling(Exception Ex)
{
await Console.Out.WriteLineAsync(JoreNoeRequestCommonTools.FormatError(Ex));
}
}
}
2.全局运行日志中间件
// webapi 全局运行日志中间件 直接使用方式
app.UseJoreNoeRequestLoggingMiddleware(info => {
Console.WriteLine("方法"+info.Method);
Console.WriteLine("路径" + info.Path);
Console.WriteLine("开始时间" + info.StartTime);
Console.WriteLine("总时长" + info.Duration);
Console.WriteLine("Get请求参数" + info.QueryString);
Console.WriteLine("BODY请求参数" + info.RequestBody);
Console.WriteLine("完整路径" + info.FullPathUrl);
Console.WriteLine("Headers" + info.Headers);
});
// 注入 自定义类继承使用方式
builder.Services.AddJoreNoeRequestLoggingMiddleware<TestMiddleWare>();
app.UseJoreNoeRequestLoggingMiddleware();
// 使用案例
using JoreNoe.Middleware;
namespace TestNET6Project
{
public class TestMiddleWare : IJorenoeRuningRequestLogging
{
public async Task RunningRequestLogging(JorenoeRuningRequestLoggingModel info)
{
Console.WriteLine("方法" + info.Method);
Console.WriteLine("路径" + info.Path);
Console.WriteLine("开始时间" + info.StartTime);
Console.WriteLine("总时长" + info.Duration);
Console.WriteLine("Get请求参数" + info.QueryString);
Console.WriteLine("BODY请求参数" + info.RequestBody);
Console.WriteLine("完整路径" + info.FullPathUrl);
Console.WriteLine("Headers" + info.Headers);
}
}
}
Jorenoe Thanks use this package !!!
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Autofac (>= 8.0.0)
- AutoMapper (>= 13.0.1)
- Dapper (>= 2.1.35)
- Dapper.Contrib (>= 2.0.78)
- EPPlus (>= 7.1.2)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
- Microsoft.EntityFrameworkCore (>= 6.0.29)
- Microsoft.EntityFrameworkCore.SqlServer (>= 6.0.29)
- Microsoft.Extensions.Configuration (>= 6.0.1)
- MySql.Data (>= 8.3.0)
- Newtonsoft.Json (>= 13.0.3)
- NPOI (>= 2.7.0)
- Pomelo.EntityFrameworkCore.MySql (>= 6.0.3)
- RabbitMQ.Client (>= 6.8.1)
- SharpZipLib (>= 1.4.2)
- StackExchange.Redis (>= 2.7.33)
- System.Data.Odbc (>= 8.0.0)
- Z.EntityFramework.Extensions.EFCore (>= 6.102.2.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
7.2.9 | 77 | 12/24/2024 | |
7.2.8 | 76 | 12/24/2024 | |
7.2.7 | 102 | 12/19/2024 | |
7.2.6 | 117 | 12/10/2024 | |
7.2.5 | 92 | 11/27/2024 | |
7.2.4 | 81 | 11/27/2024 | |
7.2.3 | 73 | 11/25/2024 | |
7.2.1 | 69 | 11/25/2024 | |
7.2.0 | 84 | 11/25/2024 | |
7.1.9 | 91 | 11/22/2024 | |
7.1.8 | 76 | 11/22/2024 | |
7.1.7 | 70 | 11/22/2024 | |
7.1.6 | 83 | 11/20/2024 | |
7.1.5 | 85 | 11/20/2024 | |
7.1.4 | 81 | 11/20/2024 | |
7.1.3 | 95 | 10/31/2024 | |
7.1.2 | 156 | 10/18/2024 | |
7.1.1 | 152 | 10/18/2024 | |
7.1.0 | 89 | 10/17/2024 | |
7.0.9 | 91 | 10/16/2024 | |
7.0.8 | 91 | 10/15/2024 | |
7.0.7 | 97 | 10/15/2024 | |
7.0.6 | 98 | 10/15/2024 | |
7.0.5 | 95 | 10/14/2024 | |
7.0.4 | 95 | 10/14/2024 | |
7.0.3 | 94 | 10/14/2024 | |
7.0.2.2 | 102 | 10/14/2024 | |
7.0.2.1 | 104 | 10/12/2024 | |
7.0.2 | 95 | 10/12/2024 | |
7.0.1.9 | 119 | 9/15/2024 | |
7.0.1.8 | 95 | 9/15/2024 | |
7.0.1.7 | 112 | 9/15/2024 | |
7.0.1.6 | 138 | 9/15/2024 | |
7.0.1.5 | 112 | 9/14/2024 | |
7.0.1.4 | 122 | 9/14/2024 | |
7.0.1.3 | 115 | 9/14/2024 | |
7.0.1.2 | 117 | 9/14/2024 | |
7.0.1.1 | 136 | 7/5/2024 | |
7.0.1 | 117 | 7/3/2024 | |
7.0.0.9 | 195 | 5/31/2024 | |
7.0.0.8 | 143 | 5/31/2024 | |
7.0.0.7 | 136 | 5/31/2024 | |
7.0.0.6 | 126 | 5/31/2024 | |
7.0.0.5 | 141 | 5/29/2024 | |
7.0.0.4 | 138 | 5/29/2024 | |
7.0.0.3 | 133 | 5/29/2024 | |
7.0.0.2 | 138 | 5/27/2024 | |
7.0.0.1 | 138 | 5/26/2024 | |
6.9.9.9 | 151 | 5/26/2024 | |
6.9.9.8 | 260 | 4/24/2024 | |
6.9.9.7 | 144 | 4/24/2024 | |
6.9.9.6 | 141 | 4/23/2024 | |
6.9.9.5 | 140 | 4/23/2024 | |
6.9.9.4 | 132 | 4/18/2024 | |
6.9.9.3 | 120 | 4/16/2024 | |
6.9.9.2 | 144 | 4/12/2024 | |
6.9.9.1 | 139 | 4/11/2024 | |
6.9.9 | 149 | 4/1/2024 | |
6.9.7 | 156 | 4/1/2024 | |
6.9.6 | 149 | 3/30/2024 | |
6.7.7 | 212 | 12/28/2023 | |
6.7.6 | 136 | 12/28/2023 | |
6.7.5 | 202 | 11/3/2023 | |
6.7.4 | 160 | 10/26/2023 | |
6.7.3 | 150 | 10/26/2023 | |
6.7.2 | 136 | 10/25/2023 | |
6.7.1 | 156 | 10/25/2023 | |
6.7.0 | 246 | 4/9/2023 | |
6.6.9 | 274 | 4/5/2023 | |
6.6.8 | 261 | 3/11/2023 | |
6.5.8 | 564 | 7/30/2022 | |
6.5.7 | 527 | 7/30/2022 | |
6.5.6 | 490 | 7/29/2022 | |
6.5.5 | 519 | 6/30/2022 | |
6.5.4 | 517 | 6/28/2022 | |
6.5.3 | 546 | 6/28/2022 | |
6.5.2 | 518 | 6/28/2022 | |
6.5.1 | 603 | 6/28/2022 | |
6.5.0 | 534 | 6/27/2022 | |
6.4.9 | 541 | 6/18/2022 | |
6.4.8 | 502 | 6/17/2022 | |
6.4.7 | 483 | 6/17/2022 | |
6.4.6 | 525 | 6/17/2022 | |
6.3.6 | 524 | 6/17/2022 | |
6.3.4 | 521 | 6/17/2022 | |
6.3.3 | 532 | 6/17/2022 | |
6.3.2 | 497 | 6/17/2022 | |
6.3.0 | 505 | 6/9/2022 | |
6.2.0 | 561 | 6/8/2022 | |
6.1.9 | 518 | 6/8/2022 | |
6.1.8 | 514 | 6/7/2022 | |
6.1.7 | 695 | 5/12/2022 | |
6.1.6 | 549 | 5/12/2022 | |
6.1.5 | 563 | 5/10/2022 | |
6.1.4 | 542 | 5/10/2022 | |
6.1.3 | 581 | 5/9/2022 | |
6.1.2 | 557 | 5/9/2022 | |
6.1.1 | 590 | 4/30/2022 | |
6.1.0 | 563 | 4/30/2022 | |
6.0.9 | 591 | 4/30/2022 | |
6.0.8 | 568 | 4/30/2022 | |
6.0.7 | 553 | 4/28/2022 | |
6.0.6 | 572 | 4/28/2022 | |
6.0.5 | 550 | 4/27/2022 | |
6.0.4 | 545 | 4/27/2022 | |
6.0.3 | 427 | 4/17/2022 | |
6.0.2 | 432 | 4/17/2022 | |
6.0.1 | 431 | 4/16/2022 | |
6.0.0 | 438 | 4/16/2022 | |
5.1.8 | 471 | 4/16/2022 | |
5.1.7 | 436 | 4/16/2022 | |
5.1.6 | 428 | 4/16/2022 | |
5.1.5 | 439 | 4/16/2022 | |
5.1.4 | 424 | 4/16/2022 | |
5.1.3 | 433 | 4/16/2022 | |
5.1.2 | 458 | 4/13/2022 | |
5.1.1 | 346 | 10/22/2021 | |
5.1.0 | 377 | 10/11/2021 | |
5.0.9 | 316 | 9/23/2021 | |
5.0.8 | 380 | 9/23/2021 | |
5.0.7 | 418 | 9/23/2021 | |
5.0.6 | 330 | 9/16/2021 | |
5.0.5 | 353 | 9/15/2021 | |
5.0.4 | 413 | 9/15/2021 | |
5.0.3 | 300 | 9/15/2021 | |
5.0.1 | 334 | 9/7/2021 | |
5.0.0 | 288 | 9/3/2021 | |
4.1.7 | 327 | 8/31/2021 | |
4.1.6 | 412 | 8/31/2021 | |
4.1.5 | 305 | 8/31/2021 | |
4.1.4 | 301 | 8/31/2021 | |
4.1.3 | 313 | 8/31/2021 | |
4.1.2 | 317 | 8/31/2021 | |
4.1.1 | 290 | 8/31/2021 | |
1.0.5 | 346 | 8/18/2021 | |
1.0.3 | 367 | 8/18/2021 | |
1.0.2 | 356 | 8/18/2021 |