Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add As/Put method to ISite to allow caching #14372

Merged
merged 11 commits into from
Nov 24, 2023
Merged

Add As/Put method to ISite to allow caching #14372

merged 11 commits into from
Nov 24, 2023

Conversation

MikeAlhayek
Copy link
Member

@sebastienros here we added As<> and Put<> to ISite for caching. This is a simple approach than PR #14337. But with the other PR, others can reuse the caching. Maybe for us this PR is the winner.

get => _properties;
set
{
_properties = value ?? new JObject();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could just not mutate _properties if the value is null in place of creating a new JObject, and then maybe not clear the cache.

I didn't have the time to try it on my side but are the new Properties well used in both way, for example populated from an existing SiteSettings in the database?


Yes, I never took the time to manage an IsReadOnly flag for a Document, but just for info, when we load a Document to be updated we call somewhere .GetOrCreateMutableAsync(), but when we get a cached Document (for sharing) we call somewhere .GetOrCreateImmutableAsync() which returns a document that normally should not be mutated.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason why to not set it to a new object? Yes there are many way to a a accomplish the same result. The base class sets it to a new Object and usually we use Put and As without having to worry if Properties is null. It is best to always initialize it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No problem to init it to a new JObject, here I meant something like this

    private JObject _properties = new();

    public new JObject Properties
    {
        get => _properties;
        set
        {
            if (value is not null)
            {
                _properties = value;
            }

            _cache.Clear();
        }
    }

But here I think we could just use this as done in Entity.

public new JObject Properties { get; set; } = new();

Not even sure that here we need a setter, so maybe

public new JObject Properties { get; } = new();

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we have to use a setting since we are overriding a property that define a setter.

If we ignore Properties = null; the user will not be able to clear Properties. This will change the behavior. I think currently it's correct. Setting it to null will just initialize it to a new object that is ready to put/get settings.

Copy link
Member

@jtkech jtkech Sep 28, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay for the setter.

In my example we still clear the cache, Hmm, if the value is null you could do _properties.RemoveAll() instead.

I would need to focus on it a little more but,

If we Get an immutable Document (only one cached instance for sharing) it should not be mutated, and if we Load a mutable Document for updating (one instance per scope) normally it should follow the current pattern to only update their related part in Properties.

So not sure we need to be able to clear this cache and then to override Properties.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, also not sure that we need a Put at this level, hmm unless if some updaters need to read a property while others update it, the entries would need to be cleared.

I talk about making a Document IsReadOnly or not, not so hard to do but at least we could do it for SiteSettings, meaning that in GetSiteSettingsAsync() the Document would be marked as IsReadOnly (internal and not serializable bool), here the cache would operate, and in LoadSiteSettingsAsync() we would set IsReadOnly to false, here the cache would not operate.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I may introduce the support of this flag in the DocumentManager itself when I will have time.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jtkech do we need to wait until adding support for the DocumentManager? I don't think we should block this PR for this. I think the PR as is provides a valid value. Maybe we take this one and if you add IsReadOnly support we can modify what is needed then.


namespace OrchardCore.Settings
{
// When updating class also update SiteSettingsDeploymentSource and SettingsStep.
public class SiteSettings : DocumentEntity, ISite
{
private JObject _properties = new();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no a simple dictionary?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The simple dictionary is below line 86

Here it is related to line 14 that defines a new Properties to override the Entity.Properties.

@sebastienros
Copy link
Member

@jtkech is it possible that we change SiteSettings without reloading the tenant? I want to prevent having local changes on cached part of the settings.

@jtkech
Copy link
Member

jtkech commented Oct 31, 2023

@sebastienros

The fact that we release the tenant on updating is only because some are used to configure options, otherwise using a given instance all is potentially possible.

Not sure I fully understand the question, I would need to try it but in the meantime as I understand the goal is to prevent deserializations.

  • When used as a shared (and cached) entity, normally we should not mutate the settings as it is currently, as mentioned we don't have a flag saying that the instance can be mutated or not.

    That said, even if we only read properties the cache is updated, so because it is a shared instance the cache would need to be a concurrent dictonary.

  • When used as a mutable entity, we could think about still using the cache, here no concurrency problem with an isolated instance, to prevent deserializations and also serializations, but we would need to know when we do the last update that would perfom the only one serialization.

    But only for updating maybe not worth to do, the easiest way being to let it working as before on updating. Otherwise would be simpler to change the Entity class itself, for example by doing the only one serialization on demand from the cached object.

    Also the new JObject Properties should be marked to not be serialized, only the Properties of the inherited Entity, is it even possible?

Sorry if I misunderstood the question ;)

@jtkech
Copy link
Member

jtkech commented Nov 20, 2023

I started to try it. So we can hook on the setters of the new Properties as a whole but not on its indexer and dynamic props as allowed by JObject, for example.

site.Properties["CurrentThemeName"] = themeName;

dynamic settings = site.Properties;
settings.CurrentThemeName = themeName;

In fact the problem can be potentially for all the graph of the object, for example.

site.Properties["Prop1"]["Prop2"]["Prop3"] = someValue;

So would need to only use As<T>() and Put<T>() (so only at the root of the JObject).

Or implement a Dynamic Object as done in the Remove Newton branch (you can take a look at JsonDynamicObject) to control the indexers and dynamic binders (maybe optional for the last).

I will think about it tomorrow.

@jtkech
Copy link
Member

jtkech commented Nov 23, 2023

So the idea is there, only use the inner properties cache when the document is read only, meaning that it has been cached for sharing, not loaded for updating.

Was quickly done, need to leave but I will work on it this night.

@jtkech jtkech merged commit 3f0242f into main Nov 24, 2023
3 checks passed
@jtkech jtkech deleted the ma/as-in-isite branch November 24, 2023 03:17
DrewScoggins added a commit to dotnet-perf-bot/OrchardCore that referenced this pull request Dec 1, 2023
* mkdocs-material 9.2.8

* Release 1.7 (OrchardCMS#14111)

* Switch to 1.8.0-preview

* Position the modal over the navbar (OrchardCMS#14270)

* Add 1.8 release notes file. (OrchardCMS#14277)

* jQuery 3.7.1 (OrchardCMS#14231)

* Add @brutoledo as a contributor

* Add @dannyd89 as a contributor

* Typo SMS features

* Update libphonenumber-csharp 8.13.20 (OrchardCMS#14287)

* NLog.Web.AspNetCore 5.3.4 (OrchardCMS#14283)

* leaflet 1.9.4 (OrchardCMS#14054)

* bootstrap-select 1.14.0-beta3 (OrchardCMS#14282)

* Fixes invalid cookie name (OrchardCMS#14280)

* Add @ludovic-th as a contributor

* Move Moq into tests libraries (OrchardCMS#14260)

* Microsoft.Identity.Web 2.13.4 (OrchardCMS#14292)

* BenchmarkDotNet 0.13.8 (OrchardCMS#14293)

* mkdocs-material 9.3.0

* mkdocs-material 9.3.1

* Remove duplicate alert in settings (OrchardCMS#14299)

* Make WorkflowType extension able (OrchardCMS#14275)

* NET 6.0.22, 7.0.11 (OrchardCMS#14320)

* Update OpenIddict 4.8.0 (OrchardCMS#14321)

* Update Jint 3.0.0-beta-2051 (OrchardCMS#14322)

* Add IsViewOrPageResult() extension (OrchardCMS#14228)

* Use language keywords instead of framework type names for type references (IDE0049) (OrchardCMS#14273)

* Few missing language types in .cs (OrchardCMS#14323)

* Language Types in Razor files (OrchardCMS#14324)

* Handle InvalidToken in UserService.ProcessValidationErrors() (OrchardCMS#14331)

Co-authored-by: Mike Alhayek <[email protected]>

* Make SRI hashes consistent (OrchardCMS#13775)

* Update Form Migrations Create() (OrchardCMS#14272)

* Fix media item icon (OrchardCMS#14342)

* Update Azure.Storage.Blobs 12.18.0 (OrchardCMS#14326)

* mkdocs 1.5.3

* mkdocs-material 9.3.2

* Update Jint to 3.0.0-beta-2052 (OrchardCMS#14369)

* Update libphonenumber-csharp 8.13.21 (OrchardCMS#14376)

* xunit 2.5.1, xunit.runner.visualstudio 2.5.1, xunit.runner.visualstudio 1.3.0 (OrchardCMS#14379)

* Azure.Identity 1.10.1 (OrchardCMS#14378)

* ZString 2.5.1 (OrchardCMS#14377)

* mkdocs-material 9.4.0

* mkdocs-material 9.4.1

* mkdocs-material 9.4.2

* Fix Monaco doc link (OrchardCMS#14387)

* Upgrade to Bootstrap 5.3.2 (OrchardCMS#14294)

* Fixing Icon-Picker and cleanup sass (OrchardCMS#14393)

* Set html classes to make the scripts work again (removed in OrchardCMS#9371) (OrchardCMS#14367)

* Add a fallback function to crypto.randomUUID (OrchardCMS#14371)

* Update HtmlSantizer 8.0.718 (OrchardCMS#14395)

* Update Microsoft.Identity.Web 2.14.0 (OrchardCMS#14394)

* SASS files cleanup in TheAdmin theme (OrchardCMS#14399)

* Fix validation color in the login layout (OrchardCMS#14400)

* Update Fluid 2.5.0 (OrchardCMS#14402)

* Trim Async suffix (OrchardCMS#14407)

Co-authored-by: Vincent Jacquet <[email protected]>

* Typos in OrchardCore.Notifications (OrchardCMS#14409)

* Update libphonenumber-csharp 8.13.22 (OrchardCMS#14408)

* Fix doc typo (OrchardCMS#14411)

* mkdocs-material 9.4.3

* fix: workflow module page list issue when using PostgreSQL OrchardCMS#14334 (OrchardCMS#14412)

* Add @emrahtokalak as a contributor

* Add @vjacquet as a contributor

* Fix randomUUID, modal dialog and duplicate alerts

* Add a fallback function to crypto.randomUUID (OrchardCMS#14371)
* Fix modal dialog location
* Remove duplicate alert in settings (OrchardCMS#14299)
Co-authored-by: Hisham Bin Ateya <[email protected]>

* Add OC.Notifications.Abstractions docs (OrchardCMS#14427)

* Fix `Creating a modular ASP.NET Core application` tutorial (OrchardCMS#14415)

Emphasize that reference must be added from the applicaiton to the module

* mkdocs-material 9.4.4

* Fix form validation and link decoration (BS 5.3) (OrchardCMS#14432)

* Fix admin menu background color on small screen. (OrchardCMS#14434)

* Open the front page in the same browser instead of a blank tab. (OrchardCMS#14435)

* Fix Publish Later Buttons (OrchardCMS#14438)

* Cleanup Archive/Publish Later and remove unnecessary assets and resources (OrchardCMS#14441)

* BenchmarkDotNet 0.13.9 (OrchardCMS#14436)

* Update HtmlSantizer 8.0.723 (OrchardCMS#14429)

* Microsoft.Identity.Web 2.15.1 (OrchardCMS#14437)

* AdminBranding (OrchardCMS#14453)

* Admin Navbar link (OrchardCMS#14454)

* Upgrade TheTheme to use Bootstrap 5.3.2 (OrchardCMS#14451)

* Fix sortable widgets (OrchardCMS#14467)

* Remove "Cannot update your own roles" warning (OrchardCMS#14440)

* Fix null exception in EmailTask (OrchardCMS#14471)

* mkdocs-material 9.4.5

* Fix WidgetsListPart UI (OrchardCMS#14461)

* Memory Leaks (OrchardCMS#14348)

* Update 7.0.12 & 6.0.23 (OrchardCMS#14478)

* OpenIddict 4.9.0 (OrchardCMS#14463)

* Fix an exception in ListPart with header (OrchardCMS#14473)

* fix: workflow module page list issue when using PostgreSQL OrchardCMS#14334 (OrchardCMS#14412) (OrchardCMS#14428)

* Fix roles filter (OrchardCMS#14468)

* Docs tabs

* Enable tabs

* Docs missing links

* Docs enable footer (Previous, Next link)

* Typo Release 1.8

* Docs reference links

* Azure.Identity 1.10.2 (OrchardCMS#14494)

* Update Taxomony field (OrchardCMS#14477)

* Introduce a new Narbar shape (OrchardCMS#14488)

* Can't Reload Stream Config Provider (OrchardCMS#14499)

* Update YesSQL 3.4.0 (OrchardCMS#14491)

* NRE in query editor (OrchardCMS#14501)

* Set index length limit for MySQL (OrchardCMS#14500)

Fix OrchardCMS#14338

* Fix a typo (OrchardCMS#14503)

* Fix TheBlogTheme shared views (OrchardCMS#14493)

* Release 1.7.1 (OrchardCMS#14474)

Fix OrchardCMS#14338

---------

Co-authored-by: yaricrolletservico <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>

* Fix mysql functional tests (OrchardCMS#14502)

* Release 1.7.1 (OrchardCMS#14506)

Co-authored-by: Sébastien Ros <[email protected]>

* Add @yaricrolletservico as a contributor

* mkdocs-material 9.4.6

* Docs GraphQL: Fix url api/graphql

* Fix messages class names (OrchardCMS#14508)

* Update 1.7.1 release notes (OrchardCMS#14509)

* js-cookie does not need to depend on jQuery (OrchardCMS#14511)

* mkdocs-git-revision-date-localized-plugin 1.2.1

* NLog.Web.AspNetCore 5.3.5

* centrally define media resources (OrchardCMS#14512)

* Fix TheAdmin & TheTheme for RTL languages (OrchardCMS#14486)

* Fixing TheTheme newly intruduced accessibility rules and HTML rules violations (Lombiq Technologies: NEST-462) (OrchardCMS#14523)

* Update libphonenumber-csharp 8.13.23 (OrchardCMS#14529)

* Add @yk as a contributor

* Fix MySQL index length (OrchardCMS#14513)

* Release 1.7.2 (OrchardCMS#14532)

* Revert " Add @yk as a contributor"

This reverts commit ce82352.

* Save Shell Config SubSections (OrchardCMS#14490)

* Microsoft.Identity.Web 2.15.2 (OrchardCMS#14540)

* SMTP should send the email if the SSL certificate is invalid (OrchardCMS#14444)

Co-authored-by: Sébastien Ros <[email protected]>

* Thumbnails for media app (OrchardCMS#14528)

* Add a way to restart a workflow instance (OrchardCMS#14470)

* pymdown-extensions 10.3.1

* Cleanup ReCaptcha services (OrchardCMS#14333)

Co-authored-by: Sébastien Ros <[email protected]>

* Change how ReCaptchaService consumes HttpClient (OrchardCMS#14544)

* Move ContentRootPoFileLocationProvider to OC.Localization.Core.PortableObject folder (OrchardCMS#13713)

* User Accounts and Custom User Settings Deployment (OrchardCMS#14208)

Co-authored-by: Mike Alhayek <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>

* xunit 2.5.3 (OrchardCMS#14558)

* Azure.Identity 1.10.3 (OrchardCMS#14557)

* Microsoft.Identity.Web 2.15.3 (OrchardCMS#14556)

* Jint 3.0.0-beta-2053 (OrchardCMS#14560)

* Media caches cleanups (OrchardCMS#14087)

* Add KeyVault without building a config (OrchardCMS#14550)

* Dotnet 8.0 (OrchardCMS#14058)

* Missing sdk (OrchardCMS#14561)

* js-cookie 3.0.5 (OrchardCMS#14559)

* HtmlSanitizer 8.0.746 (OrchardCMS#14577)

* correct bootstrap-select dependency (OrchardCMS#14578)

* Throw descriptive exception when a field is added with no type. (OrchardCMS#14569)

* Add extensions for IDisplayManager (OrchardCMS#14579)

* Register ReCaptchaService as singleton (OrchardCMS#14583)

Co-authored-by: Sébastien Ros <[email protected]>

* Assign the technical name of the field as the display name by default (OrchardCMS#14571)

* Use shape when rendering Http errors to allow cusomization from the UI (OrchardCMS#14545)

* Fix field wrappers CSS class names (OrchardCMS#14547)

* Cleanup ReCaptchaService after changing the registration type (OrchardCMS#14587)

* .NET 6.0.24, 7.0.13 (OrchardCMS#14575)

* Update GetPartWrapperCssClasses and GetFieldWrapperCssClasses helpers (OrchardCMS#14591)

* mkdocs-material 9.4.7

* Improve AdminDashboard Styling (OrchardCMS#14593)

* Monaco 0.44.0

* remove admin.css resource dependency on audit trail list (OrchardCMS#14608)

fixes OrchardCMS#14607

* Update the Admin Dashboard documentation. (OrchardCMS#14602)

* Monaco js error fix (OrchardCMS#14601)

* Remove admin.js dependency on fields and parts (OrchardCMS#14600)

* Update libphonenumber-csharp 8.13.24 (OrchardCMS#14619)

* xunit 2.6.0 (OrchardCMS#14618)

* Update StackExchange.Redis 2.7.4 (OrchardCMS#14620)

* Use CommitAsync() instead od Commit() (OrchardCMS#14622)

* BenchmarkDotNet 0.13.10 (OrchardCMS#14623)

* Add a shortcode for cache busting (OrchardCMS#14621)

Co-authored-by: Zoltán Lehóczky <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>

* Invalidate cache on updating store (OrchardCMS#14612)

* Improve performance for CssClass extensions (OrchardCMS#14615)

* Do not show dashboard widget when `DashboardWidget` is removed. (OrchardCMS#14603)

* mkdocs-material 9.4.8

* Update Jint 3.0.0-beta-2054 (OrchardCMS#14633)

* Address CssClasses helper warning (OrchardCMS#14643)

* Fix content preview editor resource dependency (OrchardCMS#14642)

* Fix the Content-preview script (OrchardCMS#14644)

* Azure.Storage.Blobs 12.19.0 (OrchardCMS#14647)

* xunit 2.6.1 (OrchardCMS#14646)

* Register TwoFactorAuthenticationClaimsProvider service (OrchardCMS#14651)

Fix OrchardCMS#14650

* Fix monaco editor widget error

* Initialize logger for YesSql to enable logging (OrchardCMS#14659)

* Cleanup workflow activities (OrchardCMS#14597)

* Microsoft.NET.Test.Sdk 17.8.0 (OrchardCMS#14665)

* pymdown-extensions 10.4

* Minor performance update for HtmlContentBuilderExtensions (OrchardCMS#14664)

* Update MailKit & MimiKit 4.3.0 (OrchardCMS#14669)

* Update xUnit Analyzers 1.5.0 (OrchardCMS#14670)

* Update Azure.Extensions.AspNetCore.Configuration.Secrets 1.3.0 (OrchardCMS#14672)

* Update Jint 3.0.0-beta-2055 (OrchardCMS#14671)

* Log a message every time Redis ConnectionMultiplexer is created

* Update Azure Identity 1.10.4 (OrchardCMS#14690)

* .NET 8.0.0 (OrchardCMS#14688)

* Update Azure Blobs 12.19.1 (OrchardCMS#14691)

* Update .NET 7.0.14 & .NET 6.0.25 (OrchardCMS#14689)

* Fix missing claims for OpenID code flow. (OrchardCMS#14686)

* OpenIddict 4.10.0 (OrchardCMS#14692)

* Add form originated http redirect task (OrchardCMS#14610)

* Set the docker image to .NET 8 (OrchardCMS#14696)

* Update workflows and test runners to use .net 8 (OrchardCMS#14702)

* Update YesSql to version 3.5.0 (OrchardCMS#14706)

* Update Moq 4.20.69 (OrchardCMS#14705)

* Drop support for .NET 6/7 (OrchardCMS#14695)

* mkdocs-material 9.4.9

* Update Microsoft.SourceLink.GitHub 8.0.0 (OrchardCMS#14714)

* Remove 'Async' term from a synchronous method (OrchardCMS#14710)

* Missing connection dispose (OrchardCMS#14709)

* Use C# 12.0 (OrchardCMS#14713)

* Little cleanup (OrchardCMS#14711)

* Register DataProtection_Azure asynchronously (OrchardCMS#14687)

* Typos in Media (OrchardCMS#14708)

* Update DocumentFormat.OpenXml 3.0.0 (OrchardCMS#14718)

* mkdocs-material 9.4.10

* xUnit VS runner (OrchardCMS#14725)

* Update xunit analyzers 1.6.0 (OrchardCMS#14724)

* Update xunit 2.6.2 (OrchardCMS#14723)

* Should not invalidate the cache of a Volatile Document. (OrchardCMS#14720)

As it is never persisted and can't be retrieved from a given store, see PR comment.

* Update Jint 3.0.0-beta-2056 (OrchardCMS#14729)

* Fix the Github release action on Windows (OrchardCMS#14707)

* Add a way to Remove User from a Role (Issue OrchardCMS#14632) (OrchardCMS#14652)

---------

Co-authored-by: Mike Alhayek <[email protected]>

* Update Microsoft.Identity.Web 2.15.5 (OrchardCMS#14733)

* Update libphonenumber-csharp  8.13.24 (OrchardCMS#14734)

* Fix Docker build (OrchardCMS#14736)

* Fix docker build (OrchardCMS#14737)

* Fix doc semantic error (OrchardCMS#14742)

* mkdocs-material>=9.4.11

* Add Async method to ContentDefinitionManager to prevent possible thread starvation (OrchardCMS#14668)

* Cleanup notifications module (OrchardCMS#14745)

* Pre-render Navbar to allow resource injection (OrchardCMS#14747)

* Add As/Put method to ISite to allow caching (OrchardCMS#14372)

* Typo (OrchardCMS#14741)

* Cleanup (OrchardCMS#14740)

* Remove compiler directives (OrchardCMS#14739)

* mkdocs-material 9.4.12

* Update HtmlSanitizer 8.0.795 (OrchardCMS#14753)

* Update  AngleSharp 1.0.6 (OrchardCMS#14673)

* pymdown-extensions 10.5

* mkdocs-material 9.4.13

* Pre-render Navbar to allow resource injection (OrchardCMS#14755)

* Don't throw lock timeout if shell activated (OrchardCMS#14756)

* Azure DP Initializer (OrchardCMS#14750)

* mkdocs-material 9.4.14

* Update Microsoft.Identity.Web 2.16.0 (OrchardCMS#14778)

* Missing OC.Media dependency (OrchardCMS#14758)

* Remove the double scroll in the notification item (OrchardCMS#14781)

* Update libphonenumber-csharp 8.13.26 (OrchardCMS#14788)

* Fix multi-targeting file locks (OrchardCMS#14732)

* Fix send button style in OC.Email (OrchardCMS#14804)

* Adding helpful methods for ContentPart, ContentType builders and Cont… (OrchardCMS#14717)

* Add full type name for Lucene lock type

In net9.0 the runtime now exposes it's own `Lock` type, dotnet/runtime#87672. This causes
a build break as there is a collision between the Lucene type and the
runtime type.

---------

Co-authored-by: Antoine Griffard <[email protected]>
Co-authored-by: Sébastien Ros <[email protected]>
Co-authored-by: Mike Alhayek <[email protected]>
Co-authored-by: Hisham Bin Ateya <[email protected]>
Co-authored-by: ludovic-th <[email protected]>
Co-authored-by: Tony Han <[email protected]>
Co-authored-by: Jean-Thierry Kéchichian <[email protected]>
Co-authored-by: Steven Spits <[email protected]>
Co-authored-by: vjacquet <[email protected]>
Co-authored-by: Vincent Jacquet <[email protected]>
Co-authored-by: Szymon Seliga <[email protected]>
Co-authored-by: Emrah Tokalak <[email protected]>
Co-authored-by: Andrii Chebukin <[email protected]>
Co-authored-by: yaricrolletservico <[email protected]>
Co-authored-by: Thomas Bolon <[email protected]>
Co-authored-by: yk <[email protected]>
Co-authored-by: Krisztián Németh <[email protected]>
Co-authored-by: lampersky <[email protected]>
Co-authored-by: Szabolcs Deme <[email protected]>
Co-authored-by: Zoltán Lehóczky <[email protected]>
Co-authored-by: Spyros <[email protected]>
Co-authored-by: Matt Varblow <[email protected]>
Co-authored-by: Banzai316 <[email protected]>
Co-authored-by: minhtaile2712 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants