Skip to content

Commit

Permalink
Merge pull request #618 from ScorexFoundation/develop
Browse files Browse the repository at this point in the history
Development of the next v3.1.0 version
  • Loading branch information
aslesarenko authored Oct 25, 2019
2 parents 983c388 + 18e262e commit 98c2744
Show file tree
Hide file tree
Showing 507 changed files with 22,327 additions and 9,962 deletions.
51 changes: 31 additions & 20 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,31 +1,42 @@
sudo: required
dist: trusty

# Tricks to avoid unnecessary cache updates
before_cache:
- find $HOME/.sbt -name "*.lock" | xargs rm
- find $HOME/.ivy2 -name "ivydata-*.properties" | xargs rm

# These directories are cached to S3 at the end of the build
- find $HOME/.sbt -name "*.lock" | xargs rm
- find $HOME/.ivy2 -name "ivydata-*.properties" | xargs rm
cache:
directories:
- $HOME/.ivy2/cache
- $HOME/.sbt
- "$HOME/.ivy2/cache"
- "$HOME/.sbt"
language: scala

jdk:
- oraclejdk9

script:
- sbt -jvm-opts .travis.jvmopts test
# enable scoverage after SpamSpecification timeout issue is resolved
# - sbt -jvm-opts .travis.jvmopts coverage test

after_success:
# - sbt coverageReport coveralls
- sbt -jvm-opts .travis.jvmopts publish

- oraclejdk8
stages:
- test
# - coverage
- name: release
if: tag =~ ^v
- name: snapshot
if: NOT tag IS present
jobs:
include:
- stage: test
script: sbt -jvm-opts .travis.jvmopts test
# enable scoverage after SpamSpecification timeout issue is resolved
# script: sbt -jvm-opts .travis.jvmopts coverage test
# - stage: coverage
# script: sbt coverageReport coveralls
- stage: release
script: sbt -jvm-opts .travis.jvmopts publishSigned sonatypeBundleRelease
- stage: snapshot
script: sbt -jvm-opts .travis.jvmopts publish
env:
global:
- secure: IGwd+lY2TfkAeX1SfzaYBwyhiiPaFrTxoF0e+4R1bkGxiGCce1hBYjn15z1HRfK+k3hgEZh/FBG7dv8LQfNWQ6AJY5PQ2zwckd4ArYMhTVpiY4eRzUMqO1/gjTCCbbTjfFKOMsR2pAw+TGeglqoX4eyziIaS8nR901dZcFvHuC1Fr5EdKFZ0x+WHnX8vaSQoDE4u1MoBnyo5cRVumXG+xvs1Q0nZXm/hd/Flfx5u3L7veKAkGtvbHmdsJoSSySTbc1MGYQtofQjbjd9AVvUhgfP32J63UCC2SqgWWKVvIjW+dUn414BV3lelnWR3FdzhC7AUJqYWVfSILh1aj3STnizRnjtCScmyoRz4ldUQ3jr4jBJOREUEus5YH2EqY1MGjX+8kUu9IjDYiQyNy1EdivcmMlXCOcAW2mi4rGDRxZOeFt1ZSHzxqSghZOFwvk/OFcdDzV4/3OnAcGz8LH5qjZU/edjmfkSls5CqxuAFqeD7RZWIu0ccjt6dzQZAf02lBX9kQuwIruC4x4E0iEjml7jmaEeOT4Hqk7wAo6EFMSEkj4EnS/Kln6Wr7JBut5qrMk0+PDgvxaKCaN8LeycCSQdoXfPO602WzfasNcOJexSmGMAE5NYfeXjq1h3F9AVHJ3TbNAOdlQTHbSOqt7WO10JphljYnFEu4aSzvaA3E60=
- secure: g4Egz1orKgCAgTckMYHHbpsFY8ppldLLUkBi0GasHN4M2zhfYlqzaJ+ZZ4soMPNshcS3XutGS+/ERF5zrnHF1C9h3txW6AJkgMkTF1q4UyKan25chdPnz1nNUrdQOvaCA4CzLIN3aQAHN40p44ELxfNTARTfbUAIcqNSrKmXZsUbhQg9yyM+gFL6cCw7SYQphC9GJq4mvW19dzzpU8MQ0AtktB6mscuUyiWgniHsnFAmeQBv0csCiMyjUsT1buIkO0gSvZBKkLXu7kXhash/mLjrBYGapVGGFORA3pWy9JCB9OfxV8Bj1wNUqPyAImjGgVfgK6RxOnQ/C4GTsf8uVH/sYIiPnzPmbCrO7fQee68/+SWtZc1kko8HuiqHvouNHmKQy+Hwku2AIdp6nZDhOuFtQTP1PbkYLrdNj1evAI6913rq51e7vDWTriWmOKjMz2m4Tj2HGJx0VS0pNOZkpxwVhHOdyc1UXurpBKgkYis1HVcaEM3trFzhsMf7kllNvJLA1COwg7KbVebKwA9gXfYrKAp6p76YMaSYodSDq9VaSDPF/2MVCZYXs+FAUZ3MzcsAZ7TegSX2OWrrneGArjcQgdMLUetm+UgBFZF7pG3BpjMLVwMgp9ulUNkq1sP1vLU08cvQv6A3W/kcyrVyCNzg80XTQqDpxz7hCTbyBSw=
- secure: gfhEv/PXEckwZPnwJHl4fBCJKCrCKK4KMeYCPNZZtKuV1gC4mZscvECm8r+kgB+o2G3i4tEIYcIC5Jbdcbjf4bk6uNZW/X3dna0irl/Mdswt7rTLzLan1rPz3k8Bylgs8ehETFBGr8HyNitEa8ODyaEXa84MPQaucXUmpHS+sUEhQn0Z70T70d1H9ZubUhGv9VLltNoSWkPGW5CPZlpQTHl63ZShfmylfQuQVTbVMdL8LLUHn2x2edlDKMGD8YPH5d+of0AKc3IKnlnMM36WjgYVsf1yehfLi0NH/b2Dzk7wLjetu/bw8Cu9Ne6/u0Lu83Hbh4DyS2iPQivDUGB+JXlHDFI4uji3GurnvpFDku1gbc4HVoFqhgOWyXQAiRllj2BXmq2vwp6797TUG4HrD2EVzIJV7eIZdWNN/QttZtNxNdSbBq8QQc92G2SU4q7PcogMSr0LpX05SfyL1sMgX2WeGzFzyMIu/+rAJhG0lPt7krBxEfQrRtTLdJ9eyeFjFQlxM6G/9gk68j+Nida6KunLwe9QEl2T+t1YbE4i9pndoCMJFxAOjirhw5OM3PfSWfb/mU7zXd4PSNK7RQIdOaPJff5C6UEM7h/iQ6riRZp1Pn7d/rxppTXsvUbtvwUYnkoOeUZyMvQNQsPI6Slns8jWl0zp5XiTmzSRVOuH3ME=
# decrypt the private key (exported via https://docs.scala-lang.org/overviews/contributors/index.html#export-your-pgp-key-pair )
before_install:
- openssl aes-256-cbc -K $encrypted_98cf3af00429_key -iv $encrypted_98cf3af00429_iv
-in ci/secring.asc.enc -out ci/secring.asc -d
# import decrypted private key
before_script: gpg --import ci/secring.asc
212 changes: 142 additions & 70 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,8 @@ lazy val commonSettings = Seq(
resolvers += Resolver.sonatypeRepo("public"),
licenses := Seq("CC0" -> url("https://creativecommons.org/publicdomain/zero/1.0/legalcode")),
homepage := Some(url("https://github.com/ScorexFoundation/sigmastate-interpreter")),
description := "Interpreter of a Sigma-State language",
pomExtra :=
<scm>
<url>git@github.com:ScorexProject/scrypto.git</url>
<connection>git@github.com:ScorexFoundation/sigmastate-interpreter.git</connection>
</scm>
<developers>
<developer>
<id>kushti</id>
Expand All @@ -30,14 +27,14 @@ lazy val commonSettings = Seq(
<name>Alexander Slesarenko</name>
<url>https://github.com/aslesarenko/</url>
</developer>
<developer>
<id>greenhat</id>
<name>Denys Zadorozhnyi</name>
<url>https://github.com/greenhat/</url>
</developer>
</developers>,
publishMavenStyle := true,
publishTo := {
val nexus = "https://oss.sonatype.org/"
if (isSnapshot.value) { Some("snapshots" at nexus + "content/repositories/snapshots") }
else { Some("releases" at nexus + "service/local/staging/deploy/maven2") }
}

publishTo := sonatypePublishToBundle.value,
)

enablePlugins(GitVersioning)
Expand Down Expand Up @@ -76,27 +73,24 @@ val scrypto = "org.scorexfoundation" %% "scrypto" % "2.1.6"
val scorexUtil = "org.scorexfoundation" %% "scorex-util" % "0.1.4"
val macroCompat = "org.typelevel" %% "macro-compat" % "1.1.1"
val paradise = "org.scalamacros" %% "paradise" % "2.1.0" cross CrossVersion.full
val debox = "org.spire-math" %% "debox" % "0.8.0"
val kiama = "org.bitbucket.inkytonik.kiama" %% "kiama" % "2.1.0"
val fastparse = "com.lihaoyi" %% "fastparse" % "1.0.0"
val commonsIo = "commons-io" % "commons-io" % "2.5"
val configs = "com.github.kxbmap" %% "configs" % "0.4.4"

val specialVersion = "master-5136809e-SNAPSHOT"
val specialCommon = "io.github.scalan" %% "common" % specialVersion
val specialCore = "io.github.scalan" %% "core" % specialVersion
val specialLibrary = "io.github.scalan" %% "library" % specialVersion

val specialVersion = "0.6.1"
val meta = "io.github.scalan" %% "meta" % specialVersion
val plugin = "io.github.scalan" %% "plugin" % specialVersion
val libraryapi = "io.github.scalan" %% "library-api" % specialVersion
val libraryimpl = "io.github.scalan" %% "library-impl" % specialVersion
val libraryconf = "io.github.scalan" %% "library-conf" % specialVersion

val testingDependencies = Seq(
"org.scalatest" %% "scalatest" % "3.0.5" % "test",
"org.scalactic" %% "scalactic" % "3.0.+" % "test",
"org.scalacheck" %% "scalacheck" % "1.14.+" % "test",
"com.storm-enroute" %% "scalameter" % "0.8.2" % Test,
"junit" % "junit" % "4.12" % "test",
"com.novocode" % "junit-interface" % "0.11" % "test",
specialCommon, (specialCommon % Test).classifier("tests"),
specialCore, (specialCore % Test).classifier("tests"),
specialLibrary, (specialLibrary % Test).classifier("tests"),
)

lazy val testSettings = Seq(
Expand All @@ -113,22 +107,18 @@ libraryDependencies ++= Seq(
scorexUtil,
"org.bouncycastle" % "bcprov-jdk15on" % "1.+",
"com.typesafe.akka" %% "akka-actor" % "2.4.+",
"org.bitbucket.inkytonik.kiama" %% "kiama" % "2.1.0",
"com.lihaoyi" %% "fastparse" % "1.0.0",
"org.spire-math" %% "debox" % "0.8.0"
kiama, fastparse, debox
) ++ testingDependencies

val circeVersion = "0.10.0"
val circeCore = "io.circe" %% "circe-core" % circeVersion
val circeGeneric = "io.circe" %% "circe-generic" % circeVersion
val circeParser = "io.circe" %% "circe-parser" % circeVersion

libraryDependencies ++= Seq(
"io.circe" %% "circe-core",
"io.circe" %% "circe-generic",
"io.circe" %% "circe-parser"
).map(_ % circeVersion)
libraryDependencies ++= Seq( circeCore, circeGeneric, circeParser )

scalacOptions ++= Seq("-feature", "-deprecation")


// set bytecode version to 8 to fix NoSuchMethodError for various ByteBuffer methods
// see https://github.com/eclipse/jetty.project/issues/3244
// these options applied only in "compile" task since scalac crashes on scaladoc compilation with "-release 8"
Expand All @@ -144,71 +134,153 @@ publishArtifact in Test := true

pomIncludeRepository := { _ => false }

credentials += Credentials(Path.userHome / ".sbt" / ".sigma-sonatype-credentials")
val credentialFile = Path.userHome / ".sbt" / ".sigma-sonatype-credentials"
credentials ++= (for {
file <- if (credentialFile.exists) Some(credentialFile) else None
} yield Credentials(file)).toSeq

credentials ++= (for {
username <- Option(System.getenv().get("SONATYPE_USERNAME"))
password <- Option(System.getenv().get("SONATYPE_PASSWORD"))
} yield Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", username, password)).toSeq


// PGP key for signing a release build published to sonatype
// signing is done by sbt-pgp plugin
// how to generate a key - https://central.sonatype.org/pages/working-with-pgp-signatures.html
// how to export a key and use it with Travis - https://docs.scala-lang.org/overviews/contributors/index.html#export-your-pgp-key-pair
pgpPublicRing := file("ci/pubring.asc")
pgpSecretRing := file("ci/secring.asc")
pgpPassphrase := sys.env.get("PGP_PASSPHRASE").map(_.toArray)
usePgpKeyHex("28E27A67AEA38DA458C72228CA9254B5E0640FE4")

def libraryDefSettings = commonSettings ++ testSettings ++ Seq(
scalacOptions ++= Seq(
// s"-Xplugin:${file(".").absolutePath }/scalanizer/target/scala-2.12/scalanizer-assembly-better-costing-2a66ed5c-SNAPSHOT.jar"
// s"-Xplugin:${file(".").absolutePath }/scalanizer/target/scala-2.12/scalanizer-assembly-core-opt-0d03a785-SNAPSHOT.jar"
)
)

lazy val common = Project("common", file("common"))
.settings(commonSettings ++ testSettings,
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
debox, commonsIo
))
.settings(publish / skip := true)

lazy val libraryapi = Project("library-api", file("library-api"))
.dependsOn(common % allConfigDependency)
.settings(libraryDefSettings :+ addCompilerPlugin(paradise),
libraryDependencies ++= Seq(
))
.settings(publish / skip := true)

lazy val libraryimpl = Project("library-impl", file("library-impl"))
.dependsOn(libraryapi % allConfigDependency)
.settings(libraryDefSettings,
libraryDependencies ++= Seq( debox ))
.settings(publish / skip := true)

lazy val core = Project("core", file("core"))
.dependsOn(common % allConfigDependency, libraryapi % allConfigDependency)
.settings(commonSettings,
libraryDependencies ++= Seq( configs, debox ))
.settings(publish / skip := true)

lazy val library = Project("library", file("library"))
.dependsOn(common % allConfigDependency, core % allConfigDependency, libraryapi, libraryimpl)
.settings(//commonSettings,
libraryDefSettings ++ testSettings,
libraryDependencies ++= Seq( debox ))
.settings(publish / skip := true)

lazy val sigmaconf = Project("sigma-conf", file("sigma-conf"))
.settings(commonSettings,
libraryDependencies ++= Seq(
plugin, libraryconf
))
.settings(commonSettings,
libraryDependencies ++= Seq(
plugin, libraryconf
))
.settings(publish / skip := true)

lazy val scalanizer = Project("scalanizer", file("scalanizer"))
.dependsOn(sigmaconf)
.settings(commonSettings,
libraryDependencies ++= Seq(meta, plugin, libraryapi, libraryimpl),
// publishArtifact in(Compile, packageBin) := false,
assemblyOption in assembly ~= { _.copy(includeScala = false, includeDependency = true) },
artifact in(Compile, assembly) := {
val art = (artifact in(Compile, assembly)).value
art.withClassifier(Some("assembly"))
},
addArtifact(artifact in(Compile, assembly), assembly)
)
.dependsOn(sigmaconf, libraryapi, libraryimpl)
.settings(commonSettings,
libraryDependencies ++= Seq(meta, plugin),
assemblyOption in assembly ~= { _.copy(includeScala = false, includeDependency = true) },
assemblyMergeStrategy in assembly := {
case PathList("scalan", xs @ _*) => MergeStrategy.first
case other => (assemblyMergeStrategy in assembly).value(other)
},
artifact in(Compile, assembly) := {
val art = (artifact in(Compile, assembly)).value
art.withClassifier(Some("assembly"))
},
addArtifact(artifact in(Compile, assembly), assembly)
)
.settings(publish / skip := true)

lazy val sigmaapi = Project("sigma-api", file("sigma-api"))
.settings(libraryDefSettings :+ addCompilerPlugin(paradise),
libraryDependencies ++= Seq(
specialCommon, libraryapi, macroCompat, scrypto, bouncycastleBcprov
))
.dependsOn(common, libraryapi)
.settings(libraryDefSettings :+ addCompilerPlugin(paradise),
libraryDependencies ++= Seq(
macroCompat, scrypto, bouncycastleBcprov
))
.settings(publish / skip := true)

lazy val sigmaimpl = Project("sigma-impl", file("sigma-impl"))
.dependsOn(sigmaapi % allConfigDependency)
.settings(libraryDefSettings,
libraryDependencies ++= Seq(
libraryapi, libraryimpl, scrypto, bouncycastleBcprov
))
.dependsOn(
sigmaapi % allConfigDependency,
libraryapi % allConfigDependency,
libraryimpl % allConfigDependency,
library % allConfigDependency)
.settings(libraryDefSettings,
libraryDependencies ++= Seq( scrypto, bouncycastleBcprov ))
.settings(publish / skip := true)

lazy val sigmalibrary = Project("sigma-library", file("sigma-library"))
.dependsOn(sigmaimpl % allConfigDependency)
.settings(libraryDefSettings,
libraryDependencies ++= Seq(
specialCommon, (specialCommon % Test).classifier("tests"),
specialCore, (specialCore % Test).classifier("tests"),
libraryapi, (libraryapi % Test).classifier("tests"),
libraryimpl, (libraryimpl % Test).classifier("tests"),
specialLibrary, (specialLibrary % Test).classifier("tests"),
scrypto,
bouncycastleBcprov
))
.dependsOn(
sigmaimpl % allConfigDependency,
common % allConfigDependency,
core % allConfigDependency,
libraryapi % allConfigDependency,
libraryimpl % allConfigDependency,
library % allConfigDependency)
.settings(libraryDefSettings,
libraryDependencies ++= Seq(
scrypto,
bouncycastleBcprov
))
.settings(publish / skip := true)

lazy val sigmastate = (project in file("sigmastate"))
.dependsOn(sigmaimpl % allConfigDependency, sigmalibrary % allConfigDependency)
.settings(libraryDefSettings)
.settings(libraryDependencies ++= Seq(
scorexUtil, kiama, fastparse, circeCore, circeGeneric, circeParser))
.settings(publish / skip := true)

lazy val sigma = (project in file("."))
.aggregate(sigmaapi, sigmaimpl, sigmalibrary, sigmaconf, scalanizer)
.dependsOn(sigmaimpl % allConfigDependency, sigmalibrary % allConfigDependency)
.settings(commonSettings: _*)
.aggregate(
sigmastate, common, core, libraryapi, libraryimpl, library,
sigmaapi, sigmaimpl, sigmalibrary, sigmaconf, scalanizer)
.settings(libraryDefSettings, rootSettings)
.settings(publish / aggregate := false)
.settings(publishLocal / aggregate := false)

lazy val aggregateCompile = ScopeFilter(
inProjects(common, core, libraryapi, libraryimpl, library, sigmaapi, sigmaimpl,
sigmalibrary, sigmastate),
inConfigurations(Compile))

lazy val rootSettings = Seq(
sources in Compile := sources.all(aggregateCompile).value.flatten,
libraryDependencies := libraryDependencies.all(aggregateCompile).value.flatten,
mappings in (Compile, packageSrc) ++= (mappings in(Compile, packageSrc)).all(aggregateCompile).value.flatten,
mappings in (Test, packageBin) ++= (mappings in(Test, packageBin)).all(aggregateCompile).value.flatten,
mappings in(Test, packageSrc) ++= (mappings in(Test, packageSrc)).all(aggregateCompile).value.flatten,
)

def runErgoTask(task: String, sigmastateVersion: String, log: Logger): Unit = {
val ergoBranch = "ergolikectx-json"
val ergoBranch = "sigma-core-opt"
val sbtEnvVars = Seq("BUILD_ENV" -> "test", "SIGMASTATE_VERSION" -> sigmastateVersion)

log.info(s"Testing current build in Ergo (branch $ergoBranch):")
Expand Down
30 changes: 30 additions & 0 deletions ci/pubring.asc
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBF2utdgBCAClRGOfWeus4AlHvCBgJVXH2CLqXLKCBggE2vwKbKvFdW1DTPZQ
T1RI6zBtMdaSNVm4ISO4dOO67VGdajr8/6kFt2+di2b7hMVaULf4UgYuZ+vvVUPp
3oSEJnHheh5ZfjV+jvL5GSAu+vgnC8qbPutCEpXBfx5zAOdLtiyegzx72asJvvkz
ghvyXVrg8gnXVtiSBV1EpfES7gZJmpuzv2dYrCtL2irlRlySLQ5JFKXrfOQvf4K9
TCxRye1UNb+3ybL0ilXoRn3jDS9RLbLxiVMjjx/Bqk/mc3MNMoa+juzvI6xIxFG0
3fwNOTXdQ6gLCjHJ9/nFvygkBW5bkeMujBhhABEBAAG0JlNpZ21hc3RhdGUgYm90
IDxkZW55c0B6YWRvcm96aG55aS5jb20+iQFUBBMBCAA+FiEEKOJ6Z66jjaRYxyIo
ypJUteBkD+QFAl2utdgCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA
CgkQypJUteBkD+Tt4Af/f5o2Yoc8ebOwMiNUYDkfUqFLzH1WySEKfAt2iXrIgVjV
NF6ddyaLadSYdU6HGJ6txn2a16TuItdBQJSTpnmiw1qtqNVJVRnUoytXeCYN0Utn
+3zYTOhkbhnIczGao+qlqhovfO8x+WPZ/2Fczm20A5TNAg7NzmeF7FP9OWLpnI4v
yktmAbpZaSoCZWC3ZPG2H3SOHUn8Lt0++ni4R0gT0HclwbyzuDgT0cmxarVzEFQQ
7nhNOhU1+1MYRpQ9wBUWFLwMvMUgA6rQeg7idtAXklGEZaN0RK3HpL1I+XAE9rYW
tdejY67u/hdInm33oqe5aJrPmH5DFNCpBpc2w2NzGbkBDQRdrrXYAQgAxGs1Fclq
MQJjIwu3dH+vBY5vdZ0M1Mhd2fjXu8s0tEZ8RjBBbtZ03KI5t97+oXs5rgKCCtRH
v+RfSDn1eTeKRIwYxsowd86SlC8rjhSAyJfWS7er7+4Jpsa1W91TucrMQMue4qEX
udlg18oNcX/MGDB+lPirL1zxp6jfysjlebx01dcKVj2a+rpyPeNNrV2M8Ywlm5/c
lmRciSXLMb+phhvcyYyvi4UmguQi7/o3hCNhRlEj4XqF6CT1S57X6nTuYRP1dcjG
GVxvlybrDIBV0oDGW0TEjGWaBwKOpqZDi8Jzj5P398nqnP0UDrW7q/qmrZcdE5ov
qYWERLqXzGwBFwARAQABiQE8BBgBCAAmFiEEKOJ6Z66jjaRYxyIoypJUteBkD+QF
Al2utdgCGwwFCQPCZwAACgkQypJUteBkD+Qbqwf+IR030kbKsE6rOLwlKUGN9pah
tZjoSxnq5K+nXn621K578z9r76rGkP84UeAvZqt2MkadhwyEqwv99DftoZCXNM8b
5oRsDOAbA0YTSPKIa8E7S8XhWzE6VCx+2DFtjrYeGhybVGd9aq6jeQgEkqioZT0n
l3acH1VsuFQdFNwBrEgAFORBt5zXtSn7lXmnOh4ZFeYCncdR3+L6nJ/PAPz0hWMz
CZjc7vGcEvAtTNb2brtHtvox0Gc0Xphe0iCaWyzN7P32+rJgsfCMj9FFQUxToZMY
ozM9at2zWzk9wOb41RLnY+rGBNQ3xNR23shWF4fcOwk6BIp+OYsSqnsEYYXuDw==
=huRW
-----END PGP PUBLIC KEY BLOCK-----
Binary file added ci/secring.asc.enc
Binary file not shown.
Loading

0 comments on commit 98c2744

Please sign in to comment.