1.分布式数据库使用CockroachDB,当前版本2.0.5需要修改代码支持子查询

2.SignalR分布式使用Redis实现


Former-commit-id: aeb589e6ccee1e5779bec6095b2283ea5b2bec44
TangShanKaiPing
wanggang 5 years ago
parent f7452a023d
commit f94828d150

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

@ -11,6 +11,7 @@ namespace EFCoreTest
//optionsBuilder.UseSqlite("Data Source=data.db;");
//optionsBuilder.UseMySql("Server=139.180.143.95;Port=3306;Database=test;Uid=admin;Pwd=admin;");
///https://www.cockroachlabs.com/docs/stable/build-a-csharp-app-with-cockroachdb.html
/// cockroach start --insecure --host=localhost --http-port=9090
/// cockroach sql --insecure
/// CREATE DATABASE test;
/// DROP DATABASE test CASCADE;
@ -46,23 +47,21 @@ namespace EFCoreTest
{
if (entry.State == EntityState.Added || entry.State == EntityState.Modified)
{
if(entry.State == EntityState.Added)
var now = DateTime.UtcNow;
if (entry.State == EntityState.Added)
{
var created = entry.Property("Created");
if (created != null)
if (entry.Properties.Any(o => o.Metadata.Name == "Created"))
{
created.CurrentValue = DateTime.UtcNow;
entry.Property("Created").CurrentValue = now;
}
}
var rowVersionProperty = entry.Property("RowVersion");
if (rowVersionProperty != null)
if (entry.Properties.Any(o => o.Metadata.Name == "RowVersion"))
{
rowVersionProperty.CurrentValue = Guid.NewGuid().ToString();
entry.Property("RowVersion").CurrentValue = Guid.NewGuid().ToString();
}
var lastModified = entry.Property("LastModified");
if (rowVersionProperty != lastModified)
if (entry.Properties.Any(o => o.Metadata.Name == "LastChanged"))
{
lastModified.CurrentValue = DateTime.UtcNow;
entry.Property("LastChanged").CurrentValue = now;
}
}
Console.WriteLine($"id:{entry.Entity.ToString()},state:{entry.State}");

@ -8,16 +8,18 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CS-Script.Core" Version="1.2.3.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.1" />
<PackageReference Include="CS-Script.Core" Version="1.3.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.1.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="3.1.2" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="JWT" Version="6.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.1" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.2" />
@ -38,7 +40,7 @@
<PackageReference Include="ValueInjecter" Version="3.2.0" />
<PackageReference Include="Flurl" Version="2.8.2" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.9" />
<PackageReference Include="Hangfire.MemoryStorage" Version="1.6.3" />
<PackageReference Include="Hangfire.MemoryStorage" Version="1.7.0" />
<PackageReference Include="Cronos" Version="0.7.0" />
<PackageReference Include="Polly" Version="7.2.0" />
</ItemGroup>

@ -32,10 +32,12 @@ using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Text.Encodings.Web;
@ -48,16 +50,13 @@ namespace Infrastructure.Web
{
private readonly IConfiguration _cfg;
private readonly IWebHostEnvironment _env;
private readonly bool _useMiniProfiler;
private string _connectionString;
private bool _useSqlite;
private readonly string _origins = "AllowAllHeaders";
public BaseStartup(IConfiguration configuration, IWebHostEnvironment env)
{
this._cfg = configuration;
this._env = env;
this._useMiniProfiler = this._cfg.GetValue<bool>("UseMiniProfiler", false);
}
public virtual void ConfigureServices(IServiceCollection services)
@ -163,11 +162,38 @@ namespace Infrastructure.Web
options.Cookie.HttpOnly = true;
});
services.AddHttpClient();
services.AddSignalR(o => o.EnableDetailedErrors = true)
.AddJsonProtocol(options =>
var signalRBuilder = services
.AddSignalR(o => o.EnableDetailedErrors = true)
.AddJsonProtocol();
var signalRRedisConnectionString = _cfg.GetConnectionString("redis");
if (!string.IsNullOrEmpty(signalRRedisConnectionString))
{
signalRBuilder = signalRBuilder.AddStackExchangeRedis(signalRRedisConnectionString, o =>
{
//options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
o.Configuration.ChannelPrefix = "iot";
//o.ConnectionFactory = async writer =>
//{
// var config = new ConfigurationOptions
// {
// AbortOnConnectFail = false
// };
// config.EndPoints.Add(IPAddress.Loopback, 0);
// config.SetDefaultPorts();
// var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
// connection.ConnectionFailed += (_, e) =>
// {
// Console.WriteLine("Connection to Redis failed.");
// };
// if (!connection.IsConnected)
// {
// Console.WriteLine("Did not connect to Redis.");
// }
// return connection;
//};
});
}
this.UseScheduler(services);
services.AddMemoryCache();

@ -8,7 +8,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.1" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.2" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.1.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client.Core" Version="3.1.1" />
<PackageReference Include="Microsoft.OpenApi.Readers" Version="1.1.4" />

@ -73,13 +73,13 @@ namespace IoTCenter.Controllers
{
var model = new
{
Products = this._productRepo.ReadOnlyTable().Select(o => new
Products = this._productRepo.ReadOnlyTable().ToList().Select(o => new
{
o.Id,
o.Number,
o.Name,
o.Image,
DeviceCount = o.Devices.Count()
DeviceCount = this._deviceRepo.ReadOnlyTable().Count(d => d.ProductId == o.Id)
}).ToList(),
Scenes = this._sceneRepo.ReadOnlyTable().Where(o => o.NodeId == null).ToList()
};
@ -100,7 +100,7 @@ namespace IoTCenter.Controllers
o.Image,
o.DisplayOrder,
o.Scenes,
DeviceCount = o.Devices.Count
DeviceCount = o.Devices.Count()
})
.ToList();
return Json(model);

@ -8,10 +8,11 @@
"ConnectionStrings": {
"postgresql": "User ID=root;Host=localhost;Port=26257;Database=iotdb;CommandTimeout=120",
"sqlite": "Data Source=iotcenter.db",
"mysql": "Server=127.0.0.1;Port=3306;Database=iotcenter;Uid=root;Pwd=root;"
"mysql": "Server=127.0.0.1;Port=3306;Database=iotcenter;Uid=root;Pwd=root;",
"redis": "127.0.0.1:6379,allowAdmin=true"
},
"AppSettings": {
"database": "postgresql",
"database": "sqlite",
"UseCookieSessionStore": false
}
}

@ -0,0 +1,10 @@
{
"Server": [
{
"name": "Redis-localhost",
"ip": "127.0.0.1",
"port": 6379,
"auth": ""
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDBjCCAe6gAwIBAgIQCxF/qQdPwHbfKutzOxTdWjANBgkqhkiG9w0BAQsFADAr
MRIwEAYDVQQKEwlDb2Nrcm9hY2gxFTATBgNVBAMTDENvY2tyb2FjaCBDQTAeFw0y
MDAzMDIwMjQ3MjRaFw0zMDAzMTEwMjQ3MjRaMCsxEjAQBgNVBAoTCUNvY2tyb2Fj
aDEVMBMGA1UEAxMMQ29ja3JvYWNoIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAxIEqWFUATMtKQmnZwyjKBMJui7TC2yzuq1lDvu3l8mMZ2xSgm738
ilX0gtwa+1RTbNcSIBpvCSJ0Gd0jJkhLLjOWYOAxu8PKgg2GpVwvFESW1XqtYOJx
6AtgL0eRLdWvTqMX+M7uBRPMIoUWMhKvoZwgsPclS4wDKMFz+x3/lH2Nfpj+G4ZA
+BpXsv1JiCu97xuCe84xw2jVQOatFGgcUuLNV5xEpAj82Kj0Kkvjr4Usj5a5iQ+4
oRby+/2BDSwlC+Ywzq1PZ2D7mS7XMqm/on+MUPGQgr+8w/sW9CFmyH8Q2wOOgeBK
7w4SVX1lz/v3NmLQ9WiklgCIrkdmV4p8HQIDAQABoyYwJDAOBgNVHQ8BAf8EBAMC
AuQwEgYDVR0TAQH/BAgwBgEB/wIBATANBgkqhkiG9w0BAQsFAAOCAQEABb9eh/FI
+CeqgTCyWKp7EtpYKyHi2mh4FfciP/8xSpM5WHc7AtIF2Gby9mVVaqqr/WbgXPfl
iIpsofZ4m8vtQ3Coh104rAzAw/TY8FT5+UHdnh+LijodaxsxCfNE3mn8eijanvHw
dFrIb5Q2yXGK0TKnWmZDmXgDjxzNRAGBVbWmtDPHhOomjAvSssSXdD95q1uszdit
BuZTLWVBID58FpwGg3DqgS4SVDrVtPKIBLr6z5ty0LeUEkxH2Ofp+RzyYsAyFJFy
e9196rOz9Gjw4NJ4hSXNZrDGiL3zO25+nWr2BMB2otTMwS5Jwx24o2tjyLTuzBd3
AZJu4hkzkS31cg==
-----END CERTIFICATE-----

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDADCCAeigAwIBAgIRAPAVrKSBmp7vpWKFynAFMbcwDQYJKoZIhvcNAQELBQAw
KzESMBAGA1UEChMJQ29ja3JvYWNoMRUwEwYDVQQDEwxDb2Nrcm9hY2ggQ0EwHhcN
MjAwMzAyMDI0NzMzWhcNMjUwMzA3MDI0NzMzWjAjMRIwEAYDVQQKEwlDb2Nrcm9h
Y2gxDTALBgNVBAMTBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQC80BKsPcAbNJWJkBbgurhzd5hX4a0uXyCBD7CTCZIcL91urF7DsSo2mA7v9xfu
39jdYJe42r00ljVllxSjaG3F2qo+8BV3x+Z4eKn7dWBg3ckMl2Kzc+N0E4gMZXac
w7wQdOV411bsogJoUKizOipoTM6GKtcwa2lgFChbmqFPXrLtzp+Zv2rqYOeh3ux2
4G1RpMTWhZ+qAsjMr1dXIwpletCJ9AsoE+TkXLt8ZL/YNkXjUrnbdHsTtKmYomtr
ife/tZ8n1xKXoT65wgMy9UQoyRI1annTj8TmBFbz8Kjkue0KUYJrua2aC5BtBgxK
8D6HXH28ubKNHABFGT1vgGDHAgMBAAGjJzAlMA4GA1UdDwEB/wQEAwIFoDATBgNV
HSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAPCXVxaC6UqMPXiMQ
mmDICK5tsqGCpYVnCKWtkYM100vbTNg0ANWUPIpiZdnoABjNsO+oY9j8pMYJ372J
xIf4aua3V+uYCDR59HVDlb9aXQxFdsdSlLVkqgxk2Zn+R8LjphR4dMZzidA93jxK
l+4IV74I368AuBOC6wAW2wR1Cb2jdKVUgE797jXLTfhmaw/wmK9HyvKc/VJ/CYAK
LMDXG8b4jy17LW3U6KlaUewZZvTlDHGDbXvc4XCWvJ7bykVBAge44NQufCkHFWHi
YGSFq57WxM+lvsbmEMo70Dae6m+6UpBLEVKju+CY/LybOg1qalWcChwRibriwLek
Jij+eQ==
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvNASrD3AGzSViZAW4Lq4c3eYV+GtLl8ggQ+wkwmSHC/dbqxe
w7EqNpgO7/cX7t/Y3WCXuNq9NJY1ZZcUo2htxdqqPvAVd8fmeHip+3VgYN3JDJdi
s3PjdBOIDGV2nMO8EHTleNdW7KICaFCoszoqaEzOhirXMGtpYBQoW5qhT16y7c6f
mb9q6mDnod7sduBtUaTE1oWfqgLIzK9XVyMKZXrQifQLKBPk5Fy7fGS/2DZF41K5
23R7E7SpmKJra4n3v7WfJ9cSl6E+ucIDMvVEKMkSNWp504/E5gRW8/Co5LntClGC
a7mtmguQbQYMSvA+h1x9vLmyjRwARRk9b4BgxwIDAQABAoIBAEGwnp6ASWLts40N
rXf4Xo4FsOH6aTc172gXnlY5wTS/Tmnf3IR3Efm2g5PnQtNf2+KBZafxqlwuWluC
6bJEddSdVBfbjYyD5uJJENKkrqhk4TrZPIS0sBDFbtLpRhAaZUbQdLnLKbngT7gd
P+RDO1fYSQ4Sv5Vf+WRs/vGH5dFnxqiyk/w9F159Cd/mJ3OHCHkuWj/as+Oz+SVW
9TBdo/8OkgmVJL/BbaTFmOpu4RSY548xkeIoUSZFmaqxtdnu0AreWpzvCSCbMvKE
IIGydcNSTI7AXdrrPEsYw74KM7n8nzFiZc1cTpTK2Ks+TVXnPDCmaJ6p0BLAp4zR
vkmL7qECgYEAy6f36KTIzVgoX4uc8JbapO2fgphvLpocGFjzKoPBzkmlK5iASh7B
gF90VGQt8AvPX/cKnsM2bqq3Ht3Gh5k0rL74RTJBkek0o369ukFRC+HPFgge3COT
ST/MosYDICmu4mh2Ecp6jWEVLHZ/7TK/Noa/Mm5I3iyZ4OtpLyr7S/ECgYEA7Vdz
v0RxR/zyExAGr+bSMSn/lYEBKxN5GTxNp/dVGt4FNulD5fzNFUiuLhSigxj2hQFj
V9Pl2jdbKHw9Dvkjs3fFHZAc85PBTQ5dI8V4+i4SssU9MWTty4HfjtPTwhn36GB4
7VZYn9WD13AHcgfCWUe2QuKJ8tp/vSMsrj8EEDcCgYBAsFTlt9n0p+kDGGS8Yx6G
Ptho8iR2yArejPqIaZuY+/mUFHfDk2thbHCWEdAprIatc9oSve0/T8ik7EsQbVC3
Al34FNORFmNa/3oifHbS8GIIHII46K/zF2nX1k/N2o+raQT/97Hf0JOaMPXHkVP9
bOW0jiVlNQOX1w7tJZj28QKBgQCgvlP0PISEfvnskzQUOj4tcgZZ2Q9Tf1LLFp55
nfeTxL6/W+jSgQ7c1WayauNN6sA7gJ8pwqevzUH9/3bTB0V4rSthRFN3XKDUcV//
dCTlPAMJ9K/nHjY3WHRypWCL206doYkFJS/MwK0UYhmIz1x/XyQ/1HIdeoJ9NK90
K9WyrQKBgCyKXhNggrDTDSlT7pBqnMNQnUHl5el6yDXYNzm0Giseh3gd1ltC7HjG
LIAwBV2w26OVMRURqcY1T8l92su/Oan+i9Y6+PyhAtf1cMu0124YVCaHgeqoaIgC
KfK5VVM/3VqqC6WMlLIH0sgY/vaxH26RGO5hn4mh7uqs1BLUxThb
-----END RSA PRIVATE KEY-----

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDLDCCAhSgAwIBAgIQU/e41gJbqGzzltiqeXePDjANBgkqhkiG9w0BAQsFADAr
MRIwEAYDVQQKEwlDb2Nrcm9hY2gxFTATBgNVBAMTDENvY2tyb2FjaCBDQTAeFw0y
MDAzMDIwMjQ3NDBaFw0yNTAzMDcwMjQ3NDBaMCMxEjAQBgNVBAoTCUNvY2tyb2Fj
aDENMAsGA1UEAxMEbm9kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AKp2OX4patQGbgLwbSoiDRa19W11fgwNvSI7PHNcyWNR87y+kypZR1ETpYPXSlVO
pTMKd+WNEtKbu7hSQldpc7gZB479H4FXmQt+2ZioIEkVs8Z9qAe8igvF0roiVR5u
3XI58Mi6ZYtID8d6sNzGtXHebDVW+QOIeVNg2XIZhw+/C50muNOb3fzCejucYAYd
jDl6Ssx3n3LBJTnPLq/J3/XmrTmvS5xW6+ephQexiWRn1M9mROAy7GFq3SOi3vJy
bh/o+3BP3oTjXn5X58FGyCAxy2cuiXmtmblMthWhhyrNYEJSfxKjWoUbEeHGiWBD
f7Vg9bKxZ6fiYAwHY72J4S0CAwEAAaNUMFIwDgYDVR0PAQH/BAQDAgWgMB0GA1Ud
JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAhBgNVHREEGjAYgglsb2NhbGhvc3SC
CyQoaG9zdG5hbWUpMA0GCSqGSIb3DQEBCwUAA4IBAQC9sijffwoXMI3oWgo3NMBQ
kYxKUr2KzyIdM3F8J6QXfTkGZr50bNkgEEltG8t8lypXYtDlLdu4Hc96ZwTR7Bv/
G93IGCTOBivcq1I1J5ESxH39dwKbLL7/KgMSucE4TWwQ5FeNOoHKAZvJWXKd4W6Q
VIjbm81kuiiYn+z+/QqcMLKG6dQU2CHm2rLWUilHX+Fir3UpV/tE59JNIN5oishD
oXCGSFyMgewaFqIaF1hoZ6+UbwUkkpR8zs68Z+9IC1Nc1XEXSbG5FT+oJcvJlmQT
+bDP/+7d3+H/y6MzoyYSkFjueV2jQvooMYHkPsiWgPTrHHawO1Gwy7SEIxNrJNlx
-----END CERTIFICATE-----

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqnY5filq1AZuAvBtKiINFrX1bXV+DA29Ijs8c1zJY1HzvL6T
KllHUROlg9dKVU6lMwp35Y0S0pu7uFJCV2lzuBkHjv0fgVeZC37ZmKggSRWzxn2o
B7yKC8XSuiJVHm7dcjnwyLpli0gPx3qw3Ma1cd5sNVb5A4h5U2DZchmHD78LnSa4
05vd/MJ6O5xgBh2MOXpKzHefcsElOc8ur8nf9eatOa9LnFbr56mFB7GJZGfUz2ZE
4DLsYWrdI6Le8nJuH+j7cE/ehONeflfnwUbIIDHLZy6Jea2ZuUy2FaGHKs1gQlJ/
EqNahRsR4caJYEN/tWD1srFnp+JgDAdjvYnhLQIDAQABAoIBAFZByuf/d1JhCows
M2FNp8flPZMtECJzVVCcHwPVYQcEMk1BNmEImmD5ixjC+ZdfW5MPagpbr7mpGn20
CmQHNYpkCAIgLjAaLpS1lNB9yxCQjc8USNHZYxV//hk4RFBJE3+4uBIq2DV5uppb
iGG/n5NGVQVMxGc4SQSbDo2BQ2oAlCPblpY8GkO9EvPbrJyclUrRv48q8SF98sH9
Tsc2GBqV0TeyKL14T5frfLR+1aL+V63UjqznWZu739gKwwgI6BPZZYm2EhfB0XIU
XxR+/owcME/wmhz8oMRjtd6ZzQfsrYLOzGPu9XvZrmDMxjdrxUspWr4ExGCovu7c
hPSaKiECgYEA1DCl8a6cBaPJbX5E2Jz7PeHPfm8dIKUZF26iauCZI0buPvYRgw53
eOQ6YsOy/3h2lyNrpfqlWs69KDteDHyh551mUEEK152ReAAnmwgQGtcBVL4+TIa5
pJJVDiotJcQneA/0JIJaGE3BkQ6MTCBvMGGv0tohr1cStA16cO3KL7kCgYEAzagF
pjjy50kxEnnGxynTSGU26TpzM/XAKuGJn7eIAMGLRYRVUU6al2DA/ma0WJx0kwox
aM+JdTv2V5peApW2N3jnXapGOZk5FK3dicz/eYyi2s+fCWzGic4yo2LSrSVzrlIA
Hva+YfHRvVOP5t4CNEVSMAsWxr9sFh/TW+U5LxUCgYA39RheEwEcT6Q4FtuLEGMF
X757hkv1JvTmBAwbCV35OqRrwDLAEBmbrPxkvV1AGAGWPAYQgHgI6YpiyL01p8x+
qzinI2/7ipcpQUkwjkDJAzhbo8wEHGdqqhh6Is9DLWaHOBXXZvThgefxHBgNn2QT
Kz/V6CaH+ft5tjA7BcqTKQKBgBn4Yd4/yszSPVQr9KIp8fhub6S8MNga7I19tbdp
oc8WodPBhlSiLHt5SGXX6mZWO5Jl8x9dNeqMC+u8HqsM5NnUdsMpQXz8kGzAF/3S
2WAsFlSza03xYpD8bQCc9iXPWPBmgoVme1w7AVV7O+zXlEetiVdvzwyCF9AjbLlq
FPKRAoGBAJrCgBRaz3O2T9ik1MC9jckVfMpvu0d4+gQqjkjrm0uoAJwGV2c5oZaq
fFNtN0y2VsIGUQKEOEsXG1ZjHe3pQG5DTu9ARlE+ackL4mNlC05ncyynDj0T1xkW
085ZzPdcVMozZFd38M60S2reFogmq6DsJwJO/Ox3YlvE815t3LNX
-----END RSA PRIVATE KEY-----

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxIEqWFUATMtKQmnZwyjKBMJui7TC2yzuq1lDvu3l8mMZ2xSg
m738ilX0gtwa+1RTbNcSIBpvCSJ0Gd0jJkhLLjOWYOAxu8PKgg2GpVwvFESW1Xqt
YOJx6AtgL0eRLdWvTqMX+M7uBRPMIoUWMhKvoZwgsPclS4wDKMFz+x3/lH2Nfpj+
G4ZA+BpXsv1JiCu97xuCe84xw2jVQOatFGgcUuLNV5xEpAj82Kj0Kkvjr4Usj5a5
iQ+4oRby+/2BDSwlC+Ywzq1PZ2D7mS7XMqm/on+MUPGQgr+8w/sW9CFmyH8Q2wOO
geBK7w4SVX1lz/v3NmLQ9WiklgCIrkdmV4p8HQIDAQABAoIBABgtCAesFYhdLnqz
SS5gk1I4lZ8skxiiE48TQWl5HWRP2vuAMy5WFn7yik2bRNqNCmKGp105w1VtXrlb
4powJMe/Yw3yJ0xBj2Wmwl0P1V75/VCwcipMUdVJqQDIHk10T8gt+qIK22/WerP4
ib2JXQBWFBORpI4B4NWfz2Qi0bHz9UbYiH6DXE2EeRJ8PnfVD4ZSejSpxMRY6ASJ
a+yOmNletGon2DftBufuMgqNTJgQ4ELiIEfEpXVWFmltLqHAhOaO10CZcIjigWeY
UO6xXrX61SNEA3i8LQ4IxKy6rkIOqK/x/vHIaJK0Zkf4HfDimB0IsZTMZ5zG6cBk
LAwMb2UCgYEA4c4C9myCtvFNiCt97cgsS6bn7gBZ+1Bf5+e7hJlmUrfUQdyzNu0B
k3xig17OlYpiv11xo/gowB76d4fuPpEZM1/0SMEdv4i08OEgbwFgTktmKaMYJZUo
e6ujTy4bc81XlomEAIm9TTfjuTbVovWzU8uGK8nez05jsZ6kkz8iMwsCgYEA3sge
asYZxR38EVEJSCBHWUhcNAV4zYMUN/JZJjH3K44uNNbBOiwVUsmea7DviXliTA56
M2HyRDuDhNXEZDSJWccBDqWfBRy1z8mvtjvReoE+8SNZ4utQ5ywpFdzXFisZa7G1
8h2fR+lc7SBbb+PS0HNgg9lGUdQ/kto8KbvnhncCgYBaK8V9GIn+elAGz69jFCu0
LjuyDEvikw8pcZ2tbwCwiZ5mira6eVzGw8YnReXjS7bxSmSGISRMzFIjB5I5RAI3
RNstbojtoq72/j/QdFE8EtoCSJHs+CqJcFov1W67CMYwZEvlVxvUSTxUCzS29b0d
+kljFSM3z8r59Csubei/TwKBgQCjY3+zbYC+6cPR6230QQAzAffli1HS39y3P32U
nraZchh/VjW29VfaNNaEQusbFzQ5dbC3+JDW7BMEHEeB+mn1txcWZ++drzXEpDXD
YFG9GAdSkUu+OjlGokOrriDtOETXkClR3dnQwt0NaFrHT/5wNP5HFNYW86SAjp/r
N82Q9wKBgG3Sn8jNR2aMfRpZGVJmzs4zosUliXhCIUV1+O/vN0MZXNLAYNOsQcKB
2GWw5828uxzrbMFdGufzkUv+NhGYt4Rbg5GZCFiFs2Fl1Y1P4tA8KA0o9/E6eAr8
yOduXHWDX1Cp4YBevWaKg0BR/ytkCXRIIR5HHyPNEU6CUhZ67yLp
-----END RSA PRIVATE KEY-----
Loading…
Cancel
Save