Skip to content

Commit

Permalink
GitHub username change: joel-jeremy (#18)
Browse files Browse the repository at this point in the history
* GitHub username change: joel-jeremy

* Update README

* Update rootProject.name

* Optimize build

* Cleanup

* Depend on JacocoReport instead of JacocoCoverageReport

* Update version from alpha to beta
  • Loading branch information
joel-jeremy committed Oct 15, 2022
1 parent 2d0102f commit a6c2780
Show file tree
Hide file tree
Showing 68 changed files with 251 additions and 236 deletions.
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Unit tests in this project follow a specific structure.
- Use `@DisplayName` to describe the scenario being tested by the `@Test` method e.g. `@DisplayName("should throw when x argument is null)`.

```java
// Class under test: io.github.joeljeremy7.deezpatcher.core.Deezpatch
// Class under test: io.github.joeljeremy.deezpatcher.core.Deezpatch
public class Deezpatch implements Dispatcher, Publisher {
public Deezpatcher(...) {
...
Expand All @@ -88,7 +88,7 @@ Unit tests in this project follow a specific structure.
}
}

// Test class: io.github.joeljeremy7.deezpatch.core.DeezpatchTests
// Test class: io.github.joeljeremy.deezpatch.core.DeezpatchTests
class DeezpatchTests {
@Nested
class Constructors {
Expand Down
42 changes: 21 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Deezpatch

[![Gradle Build](https://github.com/joeljeremy7/deezpatch/actions/workflows/gradle-build.yaml/badge.svg)](https://github.com/joeljeremy7/deezpatch/actions/workflows/gradle-build.yaml)
[![Code QL](https://github.com/joeljeremy7/deezpatch/actions/workflows/codeql.yaml/badge.svg)](https://github.com/joeljeremy7/deezpatch/actions/workflows/codeql.yaml)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.joeljeremy7.deezpatch/core/badge.svg)](https://search.maven.org/search?q=g:%22io.github.joeljeremy7.deezpatch%22)
[![Coverage Status](https://coveralls.io/repos/github/joeljeremy7/deezpatch/badge.svg?branch=main)](https://coveralls.io/github/joeljeremy7/deezpatch?branch=main)
[![Known Vulnerabilities](https://snyk.io/test/github/joeljeremy7/deezpatch/badge.svg)](https://snyk.io/test/github/joeljeremy7/deezpatch)
[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/joeljeremy7/deezpatch/blob/main/LICENSE)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=io.github.joeljeremy7.deezpatch&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=io.github.joeljeremy7.deezpatch)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=io.github.joeljeremy7.deezpatch&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=io.github.joeljeremy7.deezpatch)
[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=io.github.joeljeremy7.deezpatch&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=io.github.joeljeremy7.deezpatch)
[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=io.github.joeljeremy7.deezpatch&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=io.github.joeljeremy7.deezpatch)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=io.github.joeljeremy7.deezpatch&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=io.github.joeljeremy7.deezpatch)
[![Gradle Build](https://github.com/joel-jeremy/deezpatch/actions/workflows/gradle-build.yaml/badge.svg)](https://github.com/joel-jeremy/deezpatch/actions/workflows/gradle-build.yaml)
[![Code QL](https://github.com/joel-jeremy/deezpatch/actions/workflows/codeql.yaml/badge.svg)](https://github.com/joel-jeremy/deezpatch/actions/workflows/codeql.yaml)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.joel-jeremy.deezpatch/core/badge.svg)](https://search.maven.org/search?q=g:%22io.github.joel-jeremy.deezpatch%22)
[![Coverage Status](https://coveralls.io/repos/github/joel-jeremy/deezpatch/badge.svg?branch=main)](https://coveralls.io/github/joel-jeremy/deezpatch?branch=main)
[![Known Vulnerabilities](https://snyk.io/test/github/joel-jeremy/deezpatch/badge.svg)](https://snyk.io/test/github/joel-jeremy/deezpatch)
[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/joel-jeremy/deezpatch/blob/main/LICENSE)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=io.github.joel-jeremy.deezpatch&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=io.github.joel-jeremy.deezpatch)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=io.github.joel-jeremy.deezpatch&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=io.github.joel-jeremy.deezpatch)
[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=io.github.joel-jeremy.deezpatch&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=io.github.joel-jeremy.deezpatch)
[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=io.github.joel-jeremy.deezpatch&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=io.github.joel-jeremy.deezpatch)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=io.github.joel-jeremy.deezpatch&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=io.github.joel-jeremy.deezpatch)
[![Discord](https://img.shields.io/discord/1025648239162175578.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord&color=17cf48)](https://discord.gg/TMmVtcfu)

A simple dispatch library.
Expand All @@ -22,15 +22,15 @@ The library aims to help build applications which apply the [Command Query Respo
### Gradle

```groovy
implementation "io.github.joeljeremy7.deezpatch:core:${version}"
implementation "io.github.joel-jeremy.deezpatch:deezpatch-core:${version}"
```

### Maven

```xml
<dependency>
<groupId>io.github.joeljeremy7.deezpatch</groupId>
<artifactId>core</artifactId>
<groupId>io.github.joel-jeremy.deezpatch</groupId>
<artifactId>deezpatch-core</artifactId>
<version>${version}</version>
</dependency>
```
Expand All @@ -39,23 +39,23 @@ implementation "io.github.joeljeremy7.deezpatch:core:${version}"

Deezpatch jars are published with Automatic-Module-Name manifest attribute:

- Core - `io.github.joeljeremy7.deezpatch.core`
- Core - `io.github.joeljeremy.deezpatch.core`

Module authors can use above module names in their module-info.java:

```java
module foo.bar {
requires io.github.joeljeremy7.deezpatch.core;
requires io.github.joeljeremy.deezpatch.core;
}
```

## 🚀 Performance

What differentiates Deezpatch from other messaging/dispatch libraries? The library takes advantage of the benefits provided by [java.lang.invoke.LambdaMetafactory](https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/LambdaMetafactory.html) to avoid the cost of invoking methods reflectively. This results in performance close to directly invoking the request handler and event handler methods!

### [Java 11 Benchmarks](https://jmh.morethan.io/?source=https://raw.githubusercontent.com/joeljeremy7/deezpatch/main/core/src/jmh/java/io/github/joeljeremy7/deezpatch/core/benchmarks/results-java11.json)
### [Java 11 Benchmarks](https://jmh.morethan.io/?source=https://raw.githubusercontent.com/joel-jeremy/deezpatch/main/deezpatch-core/src/jmh/java/io/github/joeljeremy/deezpatch/core/benchmarks/results-java11.json)

### [Java 17 Benchmarks](https://jmh.morethan.io/?source=https://raw.githubusercontent.com/joeljeremy7/deezpatch/main/core/src/jmh/java/io/github/joeljeremy7/deezpatch/core/benchmarks/results-java17.json)
### [Java 17 Benchmarks](https://jmh.morethan.io/?source=https://raw.githubusercontent.com/joel-jeremy/deezpatch/main/deezpatch-core/src/jmh/java/io/github/joeljeremy/deezpatch/core/benchmarks/results-java17.json)

## ✉️ Requests

Expand Down Expand Up @@ -84,7 +84,7 @@ public class PingQuery implements Request<Pong> {}

## 📨 Request Handlers

Requests are handled by request handlers. Request handlers can be registered through the use of the [@RequestHandler](core/src/main/java/io/github/joeljeremy7/deezpatch/core/RequestHandler.java) annotation.
Requests are handled by request handlers. Request handlers can be registered through the use of the [@RequestHandler](core/src/main/java/io/github/joeljeremy/deezpatch/core/RequestHandler.java) annotation.

A request must only have a single request handler.

Expand Down Expand Up @@ -149,7 +149,7 @@ public class GreetedEvent implements Event {

## 📨 Event Handlers

Events are handled by event handlers. Event handlers can be registered through the use of the [@EventHandler](core/src/main/java/io/github/joeljeremy7/deezpatch/core/EventHandler.java) annotation.
Events are handled by event handlers. Event handlers can be registered through the use of the [@EventHandler](core/src/main/java/io/github/joeljeremy/deezpatch/core/EventHandler.java) annotation.

An event can have zero or more event handlers.

Expand Down Expand Up @@ -193,7 +193,7 @@ public static void main(String[] args) {

## 🔩 Easy Integration with Dependency Injection (DI) Frameworks

The library provides a [InstanceProvider](core/src/main/java/io/github/joeljeremy7/deezpatch/core/InstanceProvider.java) to let users customize how request/event handler instances should be instantiated. This can be as simple as `new`-ing up request/event handlers or getting instances from a DI framework such as Spring's `ApplicationContext`, Guice's `Injector`, etc.
The library provides a [InstanceProvider](core/src/main/java/io/github/joeljeremy/deezpatch/core/InstanceProvider.java) to let users customize how request/event handler instances should be instantiated. This can be as simple as `new`-ing up request/event handlers or getting instances from a DI framework such as Spring's `ApplicationContext`, Guice's `Injector`, etc.

### Example with No DI frameworks

Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ apply from: "${rootDir}/gradle/dependency-updates.gradle"
allprojects {
apply from: "${rootDir}/gradle/dependency-versions.gradle"

group = "io.github.joeljeremy7.deezpatch"
group = "io.github.joel-jeremy.deezpatch"

def snapshotSuffix = rootProject.hasProperty("release") ? "" : "-SNAPSHOT"
version = "1.0.0-alpha.4" + snapshotSuffix
version = "1.0.0-beta" + snapshotSuffix

repositories {
mavenLocal()
Expand Down
2 changes: 1 addition & 1 deletion core/build.gradle → deezpatch-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description = "Deezpatch Core"
jar {
manifest {
attributes(
"Automatic-Module-Name": "io.github.joeljeremy7.deezpatch.core"
"Automatic-Module-Name": "io.github.joeljeremy.deezpatch.core"
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package io.github.joeljeremy7.deezpatch.core.benchmarks;
package io.github.joeljeremy.deezpatch.core.benchmarks;

import an.awesome.pipelinr.Command;
import an.awesome.pipelinr.Notification;
import an.awesome.pipelinr.Pipelinr;
import an.awesome.pipelinr.Voidy;
import io.github.joeljeremy7.deezpatch.core.Deezpatch;
import io.github.joeljeremy7.deezpatch.core.Event;
import io.github.joeljeremy7.deezpatch.core.EventHandler;
import io.github.joeljeremy7.deezpatch.core.Request;
import io.github.joeljeremy7.deezpatch.core.RequestHandler;
import io.github.joeljeremy.deezpatch.core.Deezpatch;
import io.github.joeljeremy.deezpatch.core.Event;
import io.github.joeljeremy.deezpatch.core.EventHandler;
import io.github.joeljeremy.deezpatch.core.Request;
import io.github.joeljeremy.deezpatch.core.RequestHandler;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import org.greenrobot.eventbus.EventBus;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchEvent",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -60,7 +60,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchRequest",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchRequest",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -119,7 +119,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.eventBusEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.eventBusEvent",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -178,7 +178,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrCommand",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrCommand",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -237,7 +237,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrNotification",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrNotification",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -296,7 +296,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.springEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.springEvent",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -355,7 +355,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchEvent",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -414,7 +414,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchRequest",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchRequest",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -473,7 +473,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.eventBusEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.eventBusEvent",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -532,7 +532,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrCommand",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrCommand",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -591,7 +591,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrNotification",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrNotification",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -650,7 +650,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.springEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.springEvent",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchEvent",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -60,7 +60,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchRequest",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.deezpatchRequest",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -119,7 +119,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.eventBusEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.eventBusEvent",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -178,7 +178,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrCommand",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrCommand",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -237,7 +237,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrNotification",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.pipelinrNotification",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -296,7 +296,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.springEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksThrpt.springEvent",
"mode" : "thrpt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -355,7 +355,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchEvent",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -414,7 +414,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchRequest",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.deezpatchRequest",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -473,7 +473,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.eventBusEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.eventBusEvent",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -532,7 +532,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrCommand",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrCommand",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -591,7 +591,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrNotification",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.pipelinrNotification",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down Expand Up @@ -650,7 +650,7 @@
},
{
"jmhVersion" : "1.35",
"benchmark" : "io.github.joeljeremy7.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.springEvent",
"benchmark" : "io.github.joeljeremy.deezpatch.core.benchmarks.Benchmarks.BenchmarksAvgt.springEvent",
"mode" : "avgt",
"threads" : 1,
"forks" : 2,
Expand Down

0 comments on commit a6c2780

Please sign in to comment.