diff --git a/.editorconfig b/.editorconfig index f13063ac8065..884f1ae1eab3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,6 +15,12 @@ insert_final_newline = true [*.scala] indent_size = 2 +[*.sc] +indent_size = 2 + +[*.sbt] +indent_size = 2 + [*.conf] indent_size = 2 diff --git a/admin/app/controllers/TroubleshooterController.scala b/admin/app/controllers/TroubleshooterController.scala index 6e1bbfeaaed8..c02a01d0bd74 100644 --- a/admin/app/controllers/TroubleshooterController.scala +++ b/admin/app/controllers/TroubleshooterController.scala @@ -10,7 +10,6 @@ import com.amazonaws.services.ec2.{AmazonEC2, AmazonEC2ClientBuilder} import com.amazonaws.services.ec2.model.{DescribeInstancesRequest, Filter} import scala.collection.JavaConverters._ -import scala.collection.JavaConversions._ import scala.concurrent.Future import scala.concurrent.duration._ import conf.Configuration.aws.credentials @@ -110,8 +109,8 @@ class TroubleshooterController(wsClient: WSClient, val controllerComponents: Con }.asJavaCollection val instancesDnsName: Seq[String] = awsEc2Client.map( _.describeInstances(new DescribeInstancesRequest().withFilters(tagsAsFilters)) - .getReservations - .flatMap(_.getInstances) + .getReservations.asScala + .flatMap(_.getInstances.asScala) .map(_.getPrivateDnsName) ).toSeq.flatten Random.shuffle(instancesDnsName).headOption diff --git a/admin/app/dfp/AdvertiserAgent.scala b/admin/app/dfp/AdvertiserAgent.scala index bc0f697dbe33..320aa3ba5b39 100644 --- a/admin/app/dfp/AdvertiserAgent.scala +++ b/admin/app/dfp/AdvertiserAgent.scala @@ -1,6 +1,6 @@ package dfp -import common.AkkaAgent +import com.gu.Box import common.dfp.GuAdvertiser import tools.BlockingOperations @@ -8,7 +8,7 @@ import scala.concurrent.{ExecutionContext, Future} class AdvertiserAgent(blockingOperations: BlockingOperations, dfpApi: DfpApi) { - private lazy val cache = AkkaAgent(Seq.empty[GuAdvertiser]) + private lazy val cache = Box(Seq.empty[GuAdvertiser]) def refresh()(implicit executionContext: ExecutionContext): Future[Seq[GuAdvertiser]] = { blockingOperations.executeBlocking(dfpApi.getAllAdvertisers).flatMap { freshData => diff --git a/admin/app/dfp/CreativeTemplateAgent.scala b/admin/app/dfp/CreativeTemplateAgent.scala index 3fdc3db62ac4..30297326a281 100644 --- a/admin/app/dfp/CreativeTemplateAgent.scala +++ b/admin/app/dfp/CreativeTemplateAgent.scala @@ -1,6 +1,6 @@ package dfp -import common.AkkaAgent +import com.gu.Box import common.dfp.GuCreativeTemplate import tools.BlockingOperations @@ -8,7 +8,7 @@ import scala.concurrent.{ExecutionContext, Future} class CreativeTemplateAgent(blockingOperations: BlockingOperations, dfpApi: DfpApi) { - private lazy val cache = AkkaAgent(Seq.empty[GuCreativeTemplate]) + private lazy val cache = Box(Seq.empty[GuCreativeTemplate]) def refresh()(implicit executionContext: ExecutionContext): Future[Seq[GuCreativeTemplate]] = { blockingOperations.executeBlocking(dfpApi.readActiveCreativeTemplates()).flatMap { freshData => diff --git a/admin/app/dfp/DataAgent.scala b/admin/app/dfp/DataAgent.scala index 6aea7b40298f..a0121b75160e 100644 --- a/admin/app/dfp/DataAgent.scala +++ b/admin/app/dfp/DataAgent.scala @@ -1,6 +1,7 @@ package dfp -import common.{AkkaAgent, Logging} +import com.gu.Box +import common.Logging import tools.BlockingOperations import scala.concurrent.{ExecutionContext, Future} @@ -9,7 +10,7 @@ import scala.util.{Failure, Success, Try} trait DataAgent[K, V] extends Logging with implicits.Strings { private val initialCache: DataCache[K, V] = DataCache(Map.empty[K, V]) - private lazy val cache = AkkaAgent(initialCache) + private lazy val cache = Box(initialCache) def blockingOperations: BlockingOperations diff --git a/admin/app/dfp/OrderAgent.scala b/admin/app/dfp/OrderAgent.scala index 592291126e71..14146bfc70b8 100644 --- a/admin/app/dfp/OrderAgent.scala +++ b/admin/app/dfp/OrderAgent.scala @@ -1,6 +1,6 @@ package dfp -import common.AkkaAgent +import com.gu.Box import common.dfp.GuOrder import tools.BlockingOperations @@ -8,7 +8,7 @@ import scala.concurrent.{ExecutionContext, Future} class OrderAgent(blockingOperations: BlockingOperations, dfpApi: DfpApi) { - private lazy val cache = AkkaAgent(Seq.empty[GuOrder]) + private lazy val cache = Box(Seq.empty[GuOrder]) def refresh()(implicit executionContext: ExecutionContext): Future[Seq[GuOrder]] = { blockingOperations.executeBlocking(dfpApi.getAllOrders).flatMap { freshData => diff --git a/admin/app/jobs/AnalyticsSanityCheckJob.scala b/admin/app/jobs/AnalyticsSanityCheckJob.scala index a82f02928ba7..71fb96dc8624 100644 --- a/admin/app/jobs/AnalyticsSanityCheckJob.scala +++ b/admin/app/jobs/AnalyticsSanityCheckJob.scala @@ -9,7 +9,7 @@ import model.diagnostics.CloudWatch import org.joda.time.DateTime import services.{CloudWatchStats, OphanApi} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.{ExecutionContext, Future} class AnalyticsSanityCheckJob(ophanApi: OphanApi) extends Logging { @@ -47,7 +47,7 @@ class AnalyticsSanityCheckJob(ophanApi: OphanApi) extends Logging { ophanViewsCount <- fOphanViews } yield { - def metricLastSum(stats: GetMetricStatisticsResult): Long = stats.getDatapoints.headOption.map(_.getSum.longValue).getOrElse(0L) + def metricLastSum(stats: GetMetricStatisticsResult): Long = stats.getDatapoints.asScala.headOption.map(_.getSum.longValue).getOrElse(0L) rawPageViews.set(metricLastSum(rawPageViewsStats)) googlePageViews.set(metricLastSum(googlePageViewsStats)) diff --git a/admin/app/jobs/ExpiringSwitchesEmailJob.scala b/admin/app/jobs/ExpiringSwitchesEmailJob.scala index 395ac5a21441..e8b8089ba17a 100644 --- a/admin/app/jobs/ExpiringSwitchesEmailJob.scala +++ b/admin/app/jobs/ExpiringSwitchesEmailJob.scala @@ -32,11 +32,11 @@ case class ExpiringSwitchesEmailJob(emailService: EmailService) extends Logging subject = "Expiring Feature Switches", htmlBody = Some(htmlBody)) - eventualResult onSuccess { - case result => log.info(s"Message sent successfully with ID: ${result.getMessageId}") + eventualResult.foreach { + result => log.info(s"Message sent successfully with ID: ${result.getMessageId}") } - eventualResult onFailure { + eventualResult.failed.foreach { case NonFatal(e) => log.error(s"Message failed: ${e.getMessage}") } diff --git a/admin/app/jobs/MissingVideoEncodingsJob.scala b/admin/app/jobs/MissingVideoEncodingsJob.scala index cf73b79025cd..09b159f1ffdb 100644 --- a/admin/app/jobs/MissingVideoEncodingsJob.scala +++ b/admin/app/jobs/MissingVideoEncodingsJob.scala @@ -1,6 +1,6 @@ package jobs -import common.{AkkaAgent, AkkaAsync, Edition, Logging} +import common.{AkkaAsync, Edition, Logging} import conf.switches.Switches import model.{Content, Video} @@ -10,6 +10,7 @@ import contentapi.ContentApiClient import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.duration._ import akka.util.Timeout +import com.gu.Box import play.api.libs.ws.WSClient import services.MissingVideoEncodings import model.diagnostics.video.DynamoDbStore @@ -17,7 +18,7 @@ import model.diagnostics.video.DynamoDbStore class VideoEncodingsJob(contentApiClient: ContentApiClient, wsClient: WSClient) extends Logging { - private val videoEncodingsAgent = AkkaAgent[Map[String, List[MissingEncoding]]](Map.empty) + private val videoEncodingsAgent = Box[Map[String, List[MissingEncoding]]](Map.empty) implicit val timeout = Timeout(5 seconds) def getReport(report: String): Option[List[MissingEncoding]] = videoEncodingsAgent().get(report) @@ -46,41 +47,39 @@ class VideoEncodingsJob(contentApiClient: ContentApiClient, wsClient: WSClient) response.results.map(Content.apply).collect { case v: Video => v } } - apiVideoResponse.onSuccess { - case allVideoContent => - val missingVideoEncodings = Future.sequence(allVideoContent.map { video => - val videoAssets = video.elements.videos.filter(_.properties.isMain).flatMap(_.videos.videoAssets).flatMap(_.url) - - val missingVideoAsssets = Future.sequence( - videoAssets.map { encoding => - doesEncodingExist(encoding) map { - case true => Some(encoding) - case false => None - } - }).map(_.flatten) - - missingVideoAsssets.map { - missingEncodings => missingEncodings.map { missingEncoding => MissingEncoding(video, missingEncoding)} - } - }).map(_.flatten) - - missingVideoEncodings.onSuccess { case missingEncodings => - missingEncodings.map { missingEncoding: MissingEncoding => - DynamoDbStore.haveSeenMissingEncoding(missingEncoding.encodingSrc, missingEncoding.url) map { - case true => log.debug(s"Already seen missing encoding: ${missingEncoding.encodingSrc} for url: ${missingEncoding.url}") - case false => - log.info(s"Send notification for missing video encoding: ${missingEncoding.encodingSrc} for url: ${missingEncoding.url}") - MissingVideoEncodings.sendMessage(akkaAsync)(missingEncoding.encodingSrc, missingEncoding.url, missingEncoding.title) - DynamoDbStore.storeMissingEncoding(missingEncoding.encodingSrc, missingEncoding.url) + apiVideoResponse.foreach { allVideoContent => + val missingVideoEncodings = Future.sequence(allVideoContent.map { video => + val videoAssets = video.elements.videos.filter(_.properties.isMain).flatMap(_.videos.videoAssets).flatMap(_.url) + + val missingVideoAsssets = Future.sequence( + videoAssets.map { encoding => + doesEncodingExist(encoding) map { + case true => Some(encoding) + case false => None } + }).map(_.flatten) + + missingVideoAsssets.map { + missingEncodings => missingEncodings.map { missingEncoding => MissingEncoding(video, missingEncoding)} + } + }).map(_.flatten) + + missingVideoEncodings.foreach { missingEncodings => + missingEncodings.map { missingEncoding: MissingEncoding => + DynamoDbStore.haveSeenMissingEncoding(missingEncoding.encodingSrc, missingEncoding.url) map { + case true => log.debug(s"Already seen missing encoding: ${missingEncoding.encodingSrc} for url: ${missingEncoding.url}") + case false => + log.info(s"Send notification for missing video encoding: ${missingEncoding.encodingSrc} for url: ${missingEncoding.url}") + MissingVideoEncodings.sendMessage(akkaAsync)(missingEncoding.encodingSrc, missingEncoding.url, missingEncoding.title) + DynamoDbStore.storeMissingEncoding(missingEncoding.encodingSrc, missingEncoding.url) } - videoEncodingsAgent.send(old => old + ("missing-encodings" -> List())) } + videoEncodingsAgent.send(old => old + ("missing-encodings" -> List())) + } } - apiVideoResponse.onFailure{ - case error: Throwable => - log.error(s"Unable to retrieve video content from api: ${error.getMessage}") + apiVideoResponse.failed.foreach { error: Throwable => + log.error(s"Unable to retrieve video content from api: ${error.getMessage}") } } } diff --git a/admin/app/jobs/RebuildIndexJob.scala b/admin/app/jobs/RebuildIndexJob.scala index 9a792f7ab494..da7964f3ca1a 100644 --- a/admin/app/jobs/RebuildIndexJob.scala +++ b/admin/app/jobs/RebuildIndexJob.scala @@ -77,8 +77,8 @@ class RebuildIndexJob(contentApiClient: ContentApiClient)(implicit executionCont implicit class RichFuture[A](future: Future[A]) { def withErrorLogging: Future[A] = { - future onFailure { - case throwable: Throwable => log.error("Error rebuilding index", throwable) + future.failed.foreach { + throwable: Throwable => log.error("Error rebuilding index", throwable) } future diff --git a/admin/app/model/abtests/AbTests.scala b/admin/app/model/abtests/AbTests.scala index 156c6e97c63d..6f9cb29fd23a 100644 --- a/admin/app/model/abtests/AbTests.scala +++ b/admin/app/model/abtests/AbTests.scala @@ -7,9 +7,10 @@ import org.joda.time.DateTime import scala.concurrent.{ExecutionContext, Future} import awswrappers.cloudwatch._ +import com.gu.Box object AbTests { - private val abTests = common.AkkaAgent[Map[String, Seq[String]]](Map.empty) + private val abTests = Box[Map[String, Seq[String]]](Map.empty) def getTests(): Map[String, Seq[String]] = { abTests.get() diff --git a/admin/app/model/diagnostics/video/DynamoDbStore.scala b/admin/app/model/diagnostics/video/DynamoDbStore.scala index f594b7cd50ee..6faa69d0af62 100644 --- a/admin/app/model/diagnostics/video/DynamoDbStore.scala +++ b/admin/app/model/diagnostics/video/DynamoDbStore.scala @@ -22,10 +22,9 @@ object DynamoDbStore extends Logging { ("web_url", new AttributeValue().withS(webUrl)) ).asJava) - client.updateItemFuture(updateItemRequest) onFailure { - case error: Throwable => - val message = error.getMessage - log.error(s"Unable to record missing video encoding with Dynamo DB: $message") + client.updateItemFuture(updateItemRequest).failed.foreach { error: Throwable => + val message = error.getMessage + log.error(s"Unable to record missing video encoding with Dynamo DB: $message") } } diff --git a/admin/app/pagepresser/HtmlCleaner.scala b/admin/app/pagepresser/HtmlCleaner.scala index 445723cf47e1..3ddc7ef4fafa 100644 --- a/admin/app/pagepresser/HtmlCleaner.scala +++ b/admin/app/pagepresser/HtmlCleaner.scala @@ -6,7 +6,7 @@ import org.jsoup.Jsoup import org.jsoup.nodes.{Element, Document} import conf.Configuration -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ abstract class HtmlCleaner extends Logging { lazy val fallbackCacheBustId = Configuration.r2Press.fallbackCachebustId @@ -31,7 +31,7 @@ abstract class HtmlCleaner extends Logging { } def repairStaticLinks(document: Document): Document = { - document.getAllElements.filter { el => + document.getAllElements.asScala.filter { el => el.hasAttr("href") && el.attr("href").contains("/static/") }.foreach { el => val staticLink = staticRegEx.findFirstMatchIn(el.attr("href")) @@ -55,7 +55,7 @@ abstract class HtmlCleaner extends Logging { } def repairStaticSources(document: Document): Document = { - val elementsWithSrc = document.getAllElements.filter { el => + val elementsWithSrc = document.getAllElements.asScala.filter { el => el.hasAttr("src") && el.attr("src").contains("/static/") } elementsWithSrc.foreach { el => @@ -81,7 +81,7 @@ abstract class HtmlCleaner extends Logging { def replaceLinks(document: Document): Document = { try { - document.getAllElements.filter{ el => + document.getAllElements.asScala.filter{ el => (el.hasAttr("href") && el.attr("href").contains("http://")) || (el.hasAttr("src") && el.attr("src").contains("http://")) }.foreach{ el => @@ -101,7 +101,7 @@ abstract class HtmlCleaner extends Logging { } def removeScripts(document: Document): Document = { - document.getElementsByTag("script").toList.foreach(_.remove()) + document.getElementsByTag("script").asScala.toList.foreach(_.remove()) document } @@ -109,10 +109,10 @@ abstract class HtmlCleaner extends Logging { val element = document.getElementById("sub-header") if (element != null) { - val ads = element.children().toList.filterNot(e => e.attr("class") == "top-navigation twelve-col top-navigation-js") + val ads = element.children().asScala.toList.filterNot(e => e.attr("class") == "top-navigation twelve-col top-navigation-js") ads.foreach(_.remove()) - val htmlComments = element.childNodes().filter(node => node.nodeName().equals("#comment")) + val htmlComments = element.childNodes().asScala.filter(node => node.nodeName().equals("#comment")) htmlComments.foreach(_.remove()) val promo = document.getElementById("promo") @@ -129,12 +129,12 @@ abstract class HtmlCleaner extends Logging { } def removeByClass(document: Document, className: String): Document = { - document.getElementsByClass(className).foreach(_.remove()) + document.getElementsByClass(className).asScala.foreach(_.remove()) document } def removeByTagName(document: Document, tagName: String): Document = { - document.getElementsByTag(tagName).foreach(_.remove()) + document.getElementsByTag(tagName).asScala.foreach(_.remove()) document } @@ -151,7 +151,7 @@ abstract class HtmlCleaner extends Logging { } def deComboLinks(document: Document): Document = { - document.getAllElements.filter( elementContainsCombo ) .foreach { el => + document.getAllElements.asScala.filter( elementContainsCombo ) .foreach { el => val combinerRegex = """//combo.guim.co.uk/(\w+)/(.+)(\.\w+)$""".r("cacheBustId", "paths", "extension") val microAppRegex = """^m-(\d+)~(.+)""".r diff --git a/admin/app/pagepresser/InteractiveHtmlCleaner.scala b/admin/app/pagepresser/InteractiveHtmlCleaner.scala index 96cd8f1ab68c..976f90846cca 100644 --- a/admin/app/pagepresser/InteractiveHtmlCleaner.scala +++ b/admin/app/pagepresser/InteractiveHtmlCleaner.scala @@ -3,7 +3,7 @@ package pagepresser import com.netaporter.uri.Uri._ import org.jsoup.Jsoup import org.jsoup.nodes.{Element, Document} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.io.Source object InteractiveHtmlCleaner extends HtmlCleaner with implicits.WSRequests { @@ -22,11 +22,11 @@ object InteractiveHtmlCleaner extends HtmlCleaner with implicits.WSRequests { } override def removeScripts(document: Document): Document = { - val scripts = document.getElementsByTag("script") + val scripts = document.getElementsByTag("script").asScala val needsJquery = scripts.exists(_.html().toLowerCase.contains("jquery")) val (interactiveScripts, nonInteractiveScripts) = scripts.partition { e => - val parentIds = e.parents().map(p => p.id()).toList + val parentIds = e.parents().asScala.map(p => p.id()).toList parentIds.contains("interactive-content") } nonInteractiveScripts.toList.foreach(_.remove()) diff --git a/admin/app/pagepresser/PollsHtmlCleaner.scala b/admin/app/pagepresser/PollsHtmlCleaner.scala index 87b0d77574c9..8ccb669ba720 100644 --- a/admin/app/pagepresser/PollsHtmlCleaner.scala +++ b/admin/app/pagepresser/PollsHtmlCleaner.scala @@ -4,7 +4,7 @@ import org.jsoup.nodes.Document import play.api.libs.json.Json import play.api.libs.ws.WSClient -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.{Await, ExecutionContext} import scala.concurrent.duration._ @@ -21,7 +21,7 @@ case class Answer(id: Int, question: Int, count: Double) class PollsHtmlCleaner(wsClient: WSClient)(implicit executionContext: ExecutionContext) extends HtmlCleaner with implicits.WSRequests { override def canClean(document: Document): Boolean = { - document.getElementsByAttribute("data-poll-url").nonEmpty + document.getElementsByAttribute("data-poll-url").asScala.nonEmpty } override def clean(document: Document, convertToHttps: Boolean): Document = { @@ -43,14 +43,14 @@ class PollsHtmlCleaner(wsClient: WSClient)(implicit executionContext: ExecutionC for (answer <- question.answers) yield { val answerPercentage = Math.round(answer.count / question.count * 100) - document.getElementById(s"a-${answer.id}").getElementsByClass("container").foreach { element => + document.getElementById(s"a-${answer.id}").getElementsByClass("container").asScala.foreach { element => element.tagName("div") element.attr("title", s"Votes cast: ${answer.count} ($answerPercentage%)") - element.getElementsByClass("poll-result-bg").foreach { barResult => + element.getElementsByClass("poll-result-bg").asScala.foreach { barResult => if(answer.id == mostAnsweredAnswerId.id) barResult.attr("class", "poll-result-bg leader") barResult.attr("style", s"width: $answerPercentage%") } - element.getElementsByClass("poll-result-figure").foreach { value => + element.getElementsByClass("poll-result-figure").asScala.foreach { value => if(answerPercentage > 70) value.attr("class", "poll-result-figure large") value.text(s"$answerPercentage%") } diff --git a/admin/app/services/CloudWatchStats.scala b/admin/app/services/CloudWatchStats.scala index b1cf90dd3b5f..675fbc3002e6 100644 --- a/admin/app/services/CloudWatchStats.scala +++ b/admin/app/services/CloudWatchStats.scala @@ -31,9 +31,8 @@ object CloudWatchStats extends Logging { .withMetricName(metric) .withDimensions(stage)) - ftr onFailure { - case exception: Exception => - log.error(s"CloudWatch GetMetricStatisticsRequest error: ${exception.getMessage}", exception) + ftr.failed.foreach { exception: Throwable => + log.error(s"CloudWatch GetMetricStatisticsRequest error: ${exception.getMessage}", exception) } ftr diff --git a/admin/app/services/EmailService.scala b/admin/app/services/EmailService.scala index f10bfa62e4f2..e3bcbc8c6708 100644 --- a/admin/app/services/EmailService.scala +++ b/admin/app/services/EmailService.scala @@ -8,7 +8,7 @@ import com.amazonaws.services.simpleemail.model.{Destination => EmailDestination import common.{AkkaAsync, Logging} import conf.Configuration.aws.mandatoryCredentials -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future, Promise} import scala.util.control.NonFatal @@ -57,16 +57,16 @@ class EmailService(akkaAsync: AkkaAsync) extends Logging { val request = new SendEmailRequest() .withSource(from) - .withDestination(new EmailDestination().withToAddresses(to).withCcAddresses(cc)) + .withDestination(new EmailDestination().withToAddresses(to.asJava).withCcAddresses(cc.asJava)) .withMessage(message) val futureResponse = sendAsync(request) - futureResponse onSuccess { - case response => log.info(s"Sent message ID ${response.getMessageId}") + futureResponse.foreach { + response => log.info(s"Sent message ID ${response.getMessageId}") } - futureResponse onFailure { + futureResponse.failed.foreach { case NonFatal(e) => log.error(s"Email send failed: ${e.getMessage}") } diff --git a/admin/app/tools/AssetMetrics.scala b/admin/app/tools/AssetMetrics.scala index 391401025b2d..0d44813ec2f2 100644 --- a/admin/app/tools/AssetMetrics.scala +++ b/admin/app/tools/AssetMetrics.scala @@ -2,11 +2,12 @@ package tools import awswrappers.cloudwatch._ import com.amazonaws.services.cloudwatch.model._ -import common.{AkkaAgent, Logging} +import com.gu.Box +import common.Logging import org.joda.time.DateTime import tools.CloudWatch._ -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.{ExecutionContext, Future} import scala.math.BigDecimal import scala.util.control.NonFatal @@ -41,7 +42,7 @@ object AssetMetrics { private def metricResults(dimension: Dimension)(implicit executionContext: ExecutionContext): Future[List[GetMetricStatisticsResult]] = allMetrics().flatMap { metricsList => Future.sequence { - metricsList.getMetrics + metricsList.getMetrics.asScala .filter(_.getDimensions.contains(dimension)) .toList .map { metric => @@ -70,7 +71,7 @@ object AssetMetricsCache extends Logging { case object sizeOfFiles extends ReportType } - private val cache = AkkaAgent[Map[ReportType, List[AssetMetric]]](Map.empty) + private val cache = Box[Map[ReportType, List[AssetMetric]]](Map.empty) private def getReport(reportType: ReportType): Option[List[AssetMetric]] = cache().get(reportType) diff --git a/admin/app/tools/CloudWatch.scala b/admin/app/tools/CloudWatch.scala index 1c8b8f9c16e9..1cb1ff0a0ae1 100644 --- a/admin/app/tools/CloudWatch.scala +++ b/admin/app/tools/CloudWatch.scala @@ -8,11 +8,11 @@ import conf.Configuration import conf.Configuration._ import org.joda.time.DateTime -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.{ExecutionContext, Future} case class MaximumMetric(metric: GetMetricStatisticsResult) { - lazy val max: Double = metric.getDatapoints.headOption.map(_.getMaximum.doubleValue()).getOrElse(0.0) + lazy val max: Double = metric.getDatapoints.asScala.headOption.map(_.getMaximum.doubleValue()).getOrElse(0.0) } object CloudWatch extends Logging { @@ -95,9 +95,8 @@ object CloudWatch extends Logging { ) def withErrorLogging[A](future: Future[A])(implicit executionContext: ExecutionContext): Future[A] = { - future onFailure { - case exception: Exception => - log.error(s"CloudWatch error: ${exception.getMessage}", exception) + future.failed.foreach { exception: Throwable => + log.error(s"CloudWatch error: ${exception.getMessage}", exception) } future } @@ -142,7 +141,7 @@ object CloudWatch extends Logging { latency <- fetchLatencyMetric(loadBalancer) healthyHosts <- fetchHealthyHostMetric(loadBalancer) } yield { - val chartTitle = s"${loadBalancer.name} - ${healthyHosts.getDatapoints.last.getMaximum.toInt} instances" + val chartTitle = s"${loadBalancer.name} - ${healthyHosts.getDatapoints.asScala.last.getMaximum.toInt} instances" new AwsDualYLineChart(chartTitle, ("Time", "2xx/minute", "latency (secs)"), ChartFormat(Colour.`tone-news-1`, Colour.`tone-comment-1`), oks, latency) } } @@ -306,11 +305,11 @@ object CloudWatch extends Logging { def compare(pvCount: GetMetricStatisticsResult, pvWithAdCount: GetMetricStatisticsResult): GetMetricStatisticsResult = { - val pvWithAdCountMap = pvWithAdCount.getDatapoints.map { point => + val pvWithAdCountMap = pvWithAdCount.getDatapoints.asScala.map { point => point.getTimestamp -> point.getSum.toDouble }.toMap - val confidenceValues = pvCount.getDatapoints.foldLeft(List.empty[Datapoint]) { + val confidenceValues = pvCount.getDatapoints.asScala.foldLeft(List.empty[Datapoint]) { case (soFar, pvCountValue) => val confidenceValue = pvWithAdCountMap.get(pvCountValue.getTimestamp).map { pvWithAdCountValue => pvWithAdCountValue * 100 / pvCountValue.getSum.toDouble @@ -318,7 +317,7 @@ object CloudWatch extends Logging { soFar :+ new Datapoint().withTimestamp(pvCountValue.getTimestamp).withSum(confidenceValue) } - new GetMetricStatisticsResult().withDatapoints(confidenceValues) + new GetMetricStatisticsResult().withDatapoints(confidenceValues.asJava) } for { @@ -328,11 +327,11 @@ object CloudWatch extends Logging { val confidenceMetric = compare(pageViewCount, pageViewWithAdCount) val averageMetric = { val dataPoints = confidenceMetric.getDatapoints - val average = dataPoints.map(_.getSum.toDouble).sum / dataPoints.length - val averageDataPoints = dataPoints map { point => + val average = dataPoints.asScala.map(_.getSum.toDouble).sum / dataPoints.asScala.length + val averageDataPoints = dataPoints.asScala map { point => new Datapoint().withTimestamp(point.getTimestamp).withSum(average) } - new GetMetricStatisticsResult().withDatapoints(averageDataPoints) + new GetMetricStatisticsResult().withDatapoints(averageDataPoints.asJava) } new AwsLineChart( name = "Ad Response Confidence", diff --git a/admin/app/tools/LoadBalancer.scala b/admin/app/tools/LoadBalancer.scala index 5e500ecdeb4c..5414df35a68a 100644 --- a/admin/app/tools/LoadBalancer.scala +++ b/admin/app/tools/LoadBalancer.scala @@ -1,8 +1,10 @@ package tools -import common.{Logging, AkkaAgent} +import common.Logging import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient -import scala.collection.JavaConversions._ +import com.gu.Box + +import scala.collection.JavaConverters._ case class LoadBalancer(id: String, name: String, @@ -33,7 +35,7 @@ object LoadBalancer extends Logging { ) - private val agent = AkkaAgent(loadBalancers) + private val agent = Box(loadBalancers) def refresh() { log.info("starting refresh LoadBalancer ELB DNS names") @@ -46,7 +48,7 @@ object LoadBalancer extends Logging { val elbs = client.describeLoadBalancers().getLoadBalancerDescriptions client.shutdown() val newLoadBalancers = loadBalancers.map{ lb => - lb.copy(url = elbs.find(_.getLoadBalancerName == lb.id).map(_.getDNSName)) + lb.copy(url = elbs.asScala.find(_.getLoadBalancerName == lb.id).map(_.getDNSName)) } agent.send(newLoadBalancers) } diff --git a/admin/app/tools/charts/charts.scala b/admin/app/tools/charts/charts.scala index 3b7a1a141655..b02c79f9f002 100644 --- a/admin/app/tools/charts/charts.scala +++ b/admin/app/tools/charts/charts.scala @@ -7,7 +7,7 @@ import common.editions.Uk import org.joda.time.{DateTime, DateTimeZone} import play.api.libs.json._ -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.collection.mutable.{Map => MutableMap} case class ChartRow(rowKey: String, values: Seq[Double]) { @@ -119,7 +119,7 @@ class AwsLineChart( val table = new ChartTable(dataColumns) (dataColumns, charts.toList).zipped.map( (column, chart) => { - table.addColumn(column, ChartColumn(chart.getDatapoints)) + table.addColumn(column, ChartColumn(chart.getDatapoints.asScala)) }) table.asChartRow(toLabel, toValue) @@ -147,7 +147,7 @@ class ABDataChart(name: String, ablabels: Seq[String], format: ChartFormat, char // Do not consider any metrics that have less than three data points. (ablabels.tail, charts.toList).zipped.map( (column, chart) => - (column, ChartColumn(chart.getDatapoints)) + (column, ChartColumn(chart.getDatapoints.asScala)) ).filter{ case (label, column) => column.values.length > 3 } } diff --git a/applications/app/controllers/AllIndexController.scala b/applications/app/controllers/AllIndexController.scala index 46106087361b..ea88cf453388 100644 --- a/applications/app/controllers/AllIndexController.scala +++ b/applications/app/controllers/AllIndexController.scala @@ -146,7 +146,7 @@ class AllIndexController( } } - result.onFailure { + result.failed.foreach { case GuardianContentApiError(404, _, _) => log.warn(s"Cannot fetch content for request '${request.uri}'") case e: Exception => @@ -167,7 +167,7 @@ class AllIndexController( item.results.getOrElse(Nil).headOption.flatMap(_.webPublicationDate).map(_.toJoda.withZone(DateTimeZone.UTC)) } - result.onFailure { + result.failed.foreach { case GuardianContentApiError(404, _, _) => log.warn(s"Cannot fetch content for request '${request.uri}'") case e: Exception => diff --git a/applications/app/controllers/HealthCheck.scala b/applications/app/controllers/HealthCheck.scala index ff527c2a8f08..65795891f6eb 100644 --- a/applications/app/controllers/HealthCheck.scala +++ b/applications/app/controllers/HealthCheck.scala @@ -7,7 +7,7 @@ import play.api.mvc.ControllerComponents class HealthCheck(wsClient: WSClient, sectionsLookUp: SectionsLookUp, val controllerComponents: ControllerComponents) extends CachedHealthCheck( policy = HealthCheckPolicy.All, - preconditionMaybe = Some(HealthCheckPrecondition(sectionsLookUp.isLoaded, "Sections lookup service has not been loaded yet")) + preconditionMaybe = Some(HealthCheckPrecondition(sectionsLookUp.isLoaded _, "Sections lookup service has not been loaded yet")) )( NeverExpiresSingleHealthCheck("/books"), NeverExpiresSingleHealthCheck("/books/harrypotter"), diff --git a/applications/app/jobs/SitemapLifecycle.scala b/applications/app/jobs/SitemapLifecycle.scala index dfa34bfd8522..b7b52ed872f4 100644 --- a/applications/app/jobs/SitemapLifecycle.scala +++ b/applications/app/jobs/SitemapLifecycle.scala @@ -1,6 +1,7 @@ package jobs import app.LifecycleComponent +import com.gu.Box import common._ import contentapi.ContentApiClient import services.{NewsSiteMap, VideoSiteMap} @@ -30,7 +31,7 @@ class SiteMapJob(contentApiClient: ContentApiClient) extends Logging { private val newsSiteMap = new NewsSiteMap(contentApiClient) private val videoSiteMap = new VideoSiteMap(contentApiClient) - private val siteMapContent = AkkaAgent[Option[SiteMapContent]](None) + private val siteMapContent = Box[Option[SiteMapContent]](None) def update()(implicit executionContext: ExecutionContext): Unit = { for { diff --git a/applications/test/GalleryTemplateTest.scala b/applications/test/GalleryTemplateTest.scala index 8d043aef1535..0854ca740e20 100644 --- a/applications/test/GalleryTemplateTest.scala +++ b/applications/test/GalleryTemplateTest.scala @@ -3,7 +3,7 @@ package test import conf.switches.Switches.FacebookShareUseTrailPicFirstSwitch import org.scalatest.{DoNotDiscover, Matchers, FlatSpec} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class GalleryTemplateTest extends FlatSpec with Matchers with ConfiguredTestSuite { @@ -18,25 +18,25 @@ import scala.collection.JavaConversions._ it should "render all images in the gallery" in goTo("/news/gallery/2012/may/02/picture-desk-live-kabul-burma") { browser => import browser._ - $(".gallery__item:not(.gallery__item--advert)").length should be (22) + $(".gallery__item:not(.gallery__item--advert)").asScala.length should be (22) } it should "insert ad slots after every four images" in goTo("/news/gallery/2012/may/02/picture-desk-live-kabul-burma") { browser => import browser._ - $(".gallery__item--advert").length should be (5) + $(".gallery__item--advert").asScala.length should be (5) } it should "show the twitter card meta-data" in goTo("/music/gallery/2012/jun/23/simon-bolivar-orchestra-dudamel-southbank-centre") { browser => import browser._ - $("meta[name='twitter:card']").attributes("content").head should be ("summary_large_image") - $("meta[name='twitter:title']").attributes("content").head should be ("Southbank Centre's Sounds Venezuela festival - in pictures") + $("meta[name='twitter:card']").attributes("content").asScala.head should be ("summary_large_image") + $("meta[name='twitter:title']").attributes("content").asScala.head should be ("Southbank Centre's Sounds Venezuela festival - in pictures") } it should "select the trail picture for the opengraph image when FacebookShareUseTrailPicFirstSwitch is ON" in { FacebookShareUseTrailPicFirstSwitch.switchOn() goTo("/lifeandstyle/gallery/2014/nov/24/flying-dogs-in-pictures") { browser => import browser._ - $("meta[property='og:image']").attributes("content").head should include ("61e027cb-fec8-4aa3-a12b-e50f99493399-2060x1236.jpeg") + $("meta[property='og:image']").attributes("content").asScala.head should include ("61e027cb-fec8-4aa3-a12b-e50f99493399-2060x1236.jpeg") } } @@ -44,7 +44,7 @@ import scala.collection.JavaConversions._ FacebookShareUseTrailPicFirstSwitch.switchOff() goTo("/lifeandstyle/gallery/2014/nov/24/flying-dogs-in-pictures") { browser => import browser._ - $("meta[property='og:image']").attributes("content").head should include ("e3867edb-e9d5-4be9-9c51-12258b686869-1498x2040.jpeg") + $("meta[property='og:image']").attributes("content").asScala.head should include ("e3867edb-e9d5-4be9-9c51-12258b686869-1498x2040.jpeg") } } diff --git a/applications/test/InteractiveTemplateTest.scala b/applications/test/InteractiveTemplateTest.scala index 067a36f20e3c..7ac87a11fce3 100644 --- a/applications/test/InteractiveTemplateTest.scala +++ b/applications/test/InteractiveTemplateTest.scala @@ -1,13 +1,13 @@ package test import org.scalatest.{DoNotDiscover, FlatSpec, Matchers} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class InteractiveTemplateTest extends FlatSpec with Matchers with ConfiguredTestSuite { "Interactive html template" should "show the twitter card meta-data" in goTo("/us-news/ng-interactive/2015/apr/13/marco-rubio-campaign-resume-guardian") { browser => import browser._ - $("meta[name='twitter:card']").attributes("content").head should be ("summary_large_image") - $("meta[name='twitter:title']").attributes("content").head should be ("Get to know Marco Rubio, your latest (experienced!) candidate for president") + $("meta[name='twitter:card']").attributes("content").asScala.head should be ("summary_large_image") + $("meta[name='twitter:title']").attributes("content").asScala.head should be ("Get to know Marco Rubio, your latest (experienced!) candidate for president") } } diff --git a/applications/test/SectionTemplateTest.scala b/applications/test/SectionTemplateTest.scala index 54939c29cca0..909f53412998 100644 --- a/applications/test/SectionTemplateTest.scala +++ b/applications/test/SectionTemplateTest.scala @@ -6,7 +6,7 @@ import org.fluentlenium.core.domain.FluentWebElement import org.scalatest.{DoNotDiscover, FlatSpec, Matchers} import play.api.test.TestBrowser -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class SectionTemplateTest extends FlatSpec with Matchers with ConfiguredTestSuite { @@ -25,7 +25,7 @@ import scala.collection.JavaConversions._ def getAlternateLinks(browser: TestBrowser): Seq[FluentWebElement] = { import browser._ - $("link[rel='alternate']").toList + $("link[rel='alternate']").asScala.toList .filterNot(_.attribute("type") == "application/rss+xml") .filter(element => { val href: Option[String] = Option(element.attribute("href")) diff --git a/applications/test/TagFeatureTest.scala b/applications/test/TagFeatureTest.scala index 08c3c889e438..9b31f2b58d57 100644 --- a/applications/test/TagFeatureTest.scala +++ b/applications/test/TagFeatureTest.scala @@ -2,7 +2,7 @@ package test import org.scalatest.{DoNotDiscover, FeatureSpec, GivenWhenThen, Matchers} import services.IndexPagePagination -import collection.JavaConversions._ +import collection.JavaConverters._ import conf.switches.Switches import org.fluentlenium.core.domain.{FluentWebElement, FluentList} @@ -16,7 +16,7 @@ import org.fluentlenium.core.domain.{FluentWebElement, FluentList} goTo("/technology/askjack") { browser => val trails = browser.$(".fc-item__container") - trails.length should be(IndexPagePagination.pageSize) + trails.asScala.length should be(IndexPagePagination.pageSize) } } } @@ -41,7 +41,7 @@ import org.fluentlenium.core.domain.{FluentWebElement, FluentList} goTo("/profile/samjones") { browser => Then("I should not see her profile image") val profileImages = browser.find(".profile__img img") - profileImages.length should be(0) + profileImages.asScala.length should be(0) } } @@ -57,7 +57,7 @@ import org.fluentlenium.core.domain.{FluentWebElement, FluentList} import browser._ val cardsOnFirstPage = browser.find("[data-test-id=facia-card]") - val dataIdsOnFirstPage = cardsOnFirstPage.map(_.attribute("data-id")).toSet + val dataIdsOnFirstPage = cardsOnFirstPage.asScala.map(_.attribute("data-id")).toSet cardsOnFirstPage.size should be > 10 findByRel($("link"), "next").head.attribute("href") should endWith ("/sport/cycling?page=2") findByRel($("link"), "prev") should be (None) @@ -65,7 +65,7 @@ import org.fluentlenium.core.domain.{FluentWebElement, FluentList} Then("I should be able to navigate to the 'next' page") el(".pagination").$("[rel=next]").click() val cardsOnNextPage = browser.find("[data-test-id=facia-card]") - val dataIdsOnNextPage = cardsOnNextPage.map(_.attribute("data-id")) + val dataIdsOnNextPage = cardsOnNextPage.asScala.map(_.attribute("data-id")) cardsOnNextPage.size should be > 10 findByRel($("link"), "next").head.attribute("href") should endWith ("/sport/cycling?page=3") @@ -79,11 +79,11 @@ import org.fluentlenium.core.domain.{FluentWebElement, FluentList} And("I should be able to navigate to the 'previous' page") el(".pagination").$("[rel=prev]").click() val cardsOnPreviousPage = browser.find("[data-test-id=facia-card]") - cardsOnPreviousPage.map(_.attribute("data-id")).toSet should be(dataIdsOnFirstPage) + cardsOnPreviousPage.asScala.map(_.attribute("data-id")).toSet should be(dataIdsOnFirstPage) } } } //I'm not having a happy time with the selectors on links... - private def findByRel(elements: FluentList[FluentWebElement], rel: String) = elements.toSeq.find(_.attribute("rel") == rel) + private def findByRel(elements: FluentList[FluentWebElement], rel: String) = elements.asScala.find(_.attribute("rel") == rel) } diff --git a/applications/test/common/CombinerFeatureTest.scala b/applications/test/common/CombinerFeatureTest.scala index 64d55cc2139b..db32c0fedfb3 100644 --- a/applications/test/common/CombinerFeatureTest.scala +++ b/applications/test/common/CombinerFeatureTest.scala @@ -2,7 +2,7 @@ package common import org.scalatest.{DoNotDiscover, FeatureSpec, GivenWhenThen, Matchers} import test.ConfiguredTestSuite -import collection.JavaConversions._ +import collection.JavaConverters._ @DoNotDiscover class CombinerFeatureTest extends FeatureSpec with GivenWhenThen with Matchers with ConfiguredTestSuite { @@ -16,7 +16,7 @@ import collection.JavaConversions._ import browser._ val trails = $(".fc-slice__item") Then("I should see content tagged with both tags") - trails.length should be > 1 + trails.asScala.length should be > 1 } } @@ -29,7 +29,7 @@ import collection.JavaConversions._ val trails = $(".fromage, .fc-slice__item, .linkslist__item") Then("I should see content tagged with both the section and the tag") $("[data-test-id=header-title]").text.toLowerCase should be ("science + apple") - trails.length should be > 10 + trails.asScala.length should be > 10 } } @@ -41,7 +41,7 @@ import collection.JavaConversions._ import browser._ val trails = $(".fromage, .fc-slice__item, .linkslist__item") Then("I should see content tagged with both tags") - trails.length should be > 10 + trails.asScala.length should be > 10 } } @@ -53,7 +53,7 @@ import collection.JavaConversions._ import browser._ val trails = $(".fromage, .fc-slice__item, .linkslist__item") Then("I should see content tagged with both tags") - trails.length should be > 5 + trails.asScala.length should be > 5 } } } diff --git a/applications/test/package.scala b/applications/test/package.scala index 2fa87a7aa52e..c79f4b0d6dc6 100644 --- a/applications/test/package.scala +++ b/applications/test/package.scala @@ -5,12 +5,12 @@ import java.util.{List => JList} import org.scalatest.Suites import services.{FacebookGraphApiTest, IndexPageTest, NewspaperControllerTest} -import collection.JavaConversions._ +import collection.JavaConverters._ object `package` { implicit class ListString2FirstNonEmpty(list: JList[String]) { - lazy val firstNonEmpty: Option[String] = list find { !_.isEmpty } + lazy val firstNonEmpty: Option[String] = list.asScala find { !_.isEmpty } } } diff --git a/archive/test/package.scala b/archive/test/package.scala index 6dbd9d55f96c..d2a2efaa7e0c 100644 --- a/archive/test/package.scala +++ b/archive/test/package.scala @@ -3,12 +3,12 @@ package test import java.util.{ List => JList } import org.scalatest.Suites -import collection.JavaConversions._ +import collection.JavaConverters._ object `package` { implicit class ListString2FirstNonEmpty(list: JList[String]) { - lazy val firstNonEmpty: Option[String] = list find { !_.isEmpty } + lazy val firstNonEmpty: Option[String] = list.asScala find { !_.isEmpty } } } diff --git a/article/app/model/KeyEventData.scala b/article/app/model/KeyEventData.scala index dd999f8669e5..e2e5fd7a3dec 100644 --- a/article/app/model/KeyEventData.scala +++ b/article/app/model/KeyEventData.scala @@ -2,7 +2,7 @@ package model import model.liveblog.BodyBlock.{KeyEvent, SummaryEvent} import model.liveblog.{Blocks, BodyBlock, LiveBlogDate} -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ object KeyEventData { @@ -17,10 +17,9 @@ object KeyEventData { def apply(blocks: Seq[BodyBlock], timezone: DateTimeZone): Seq[KeyEventData] = { val TimelineMaxEntries = 7 - val latestSummary = blocks.find(_.eventType == SummaryEvent) val keyEvents = blocks.filter(_.eventType == KeyEvent) - val bodyBlocks = (latestSummary.toSeq ++ keyEvents).sortBy(_.lastModifiedDate.getOrElse(new DateTime(0)).millis).reverse.take(TimelineMaxEntries) + val bodyBlocks = (latestSummary.toSeq ++ keyEvents).sortBy(_.lastModifiedDate.getOrElse(new DateTime(0)).toInstant.getMillis).reverse.take(TimelineMaxEntries) bodyBlocks.map { bodyBlock => KeyEventData(bodyBlock.id, bodyBlock.publishedCreatedDate(timezone), bodyBlock.title) diff --git a/article/test/AnalyticsFeatureTest.scala b/article/test/AnalyticsFeatureTest.scala index d3c1ab87e23e..91c6af27bafb 100644 --- a/article/test/AnalyticsFeatureTest.scala +++ b/article/test/AnalyticsFeatureTest.scala @@ -1,7 +1,7 @@ package test import org.scalatest.{DoNotDiscover, Matchers, GivenWhenThen, FeatureSpec} -import collection.JavaConversions._ +import collection.JavaConverters._ import org.fluentlenium.core.domain.FluentWebElement import conf.Configuration @@ -24,7 +24,7 @@ import conf.Configuration Given("I am on an article entitled 'Olympic opening ceremony will recreate countryside with real animals'") goTo("/sport/2012/jun/12/london-2012-olympic-opening-ceremony") { browser => Then("all links on the page should be decorated with the Omniture meta-data attribute") - val anchorsWithNoDataLink = browser.find("a").filter(hasNoLinkName) + val anchorsWithNoDataLink = browser.find("a").asScala.filter(hasNoLinkName) anchorsWithNoDataLink should have length 0 } diff --git a/article/test/ArticleControllerTest.scala b/article/test/ArticleControllerTest.scala index 5ee8553932af..8e37421569a4 100644 --- a/article/test/ArticleControllerTest.scala +++ b/article/test/ArticleControllerTest.scala @@ -6,7 +6,7 @@ import play.api.test._ import play.api.test.Helpers._ import org.scalatest.{BeforeAndAfterAll, DoNotDiscover, FlatSpec, Matchers} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class ArticleControllerTest extends FlatSpec @@ -124,6 +124,6 @@ import scala.collection.JavaConversions._ "Interactive articles" should "provide a boot.js script element as a main embed" in goTo("/sport/2015/sep/11/how-women-in-tennis-achieved-equal-pay-us-open") { browser => import browser._ - $(".media-primary > .element-interactive").attributes("data-interactive").head should endWith ("boot.js") + $(".media-primary > .element-interactive").attributes("data-interactive").asScala.head should endWith ("boot.js") } } diff --git a/article/test/ArticleFeatureTest.scala b/article/test/ArticleFeatureTest.scala index ac7a8e5b4cef..5d5aa4f26ae0 100644 --- a/article/test/ArticleFeatureTest.scala +++ b/article/test/ArticleFeatureTest.scala @@ -5,7 +5,7 @@ import conf.switches.Switches._ import org.openqa.selenium.By import org.scalatest.{DoNotDiscover, Matchers, GivenWhenThen, FeatureSpec} import org.fluentlenium.core.filter.FilterConstructor._ -import collection.JavaConversions._ +import collection.JavaConverters._ @DoNotDiscover class ArticleFeatureTest extends FeatureSpec with GivenWhenThen with Matchers with ConfiguredTestSuite { @@ -113,7 +113,7 @@ import collection.JavaConversions._ authors.last.attribute("content") should be("Mark Jones") And("it should handle escaping") - authors(4).attribute("content") should be("Phelim O'Neill") + authors.asScala(4).attribute("content") should be("Phelim O'Neill") } } @@ -218,7 +218,7 @@ import collection.JavaConversions._ goTo("/travel/2017/mar/20/10-best-things-to-do-tallinn-estonia-museums-cafe-art-beer") { browser => import browser._ - $(".ad-slot--right").length should be(1) + $(".ad-slot--right").asScala.length should be(1) val adSlotRight = $(".ad-slot--right") Then("The article-aside MPU should have the correct sizes") @@ -258,7 +258,7 @@ import collection.JavaConversions._ Then("I should see pictures in the body of the article") - $(".content__article-body .element-image").length should be(2) + $(".content__article-body .element-image").asScala.length should be(2) val inBodyImage = el(".content__article-body .element-image") @@ -312,12 +312,12 @@ import collection.JavaConversions._ Then("It should automatically link to tags") val taglinks = $("a[data-link-name=auto-linked-tag]") - taglinks.length should be(2) + taglinks.asScala.length should be(2) - taglinks(0).text should be("GCHQ") - taglinks(0).attribute("href") should endWith("/uk/gchq") + taglinks.asScala(0).text should be("GCHQ") + taglinks.asScala(0).attribute("href") should endWith("/uk/gchq") - taglinks(1).text should be("Pakistan") + taglinks.asScala(1).text should be("Pakistan") } } @@ -330,7 +330,7 @@ import collection.JavaConversions._ Then("It should automatically link to tags") val taglinks = $("a[data-link-name=auto-linked-tag]") - taglinks.map(_.text) should not contain "Science" + taglinks.asScala.map(_.text) should not contain "Science" } } @@ -344,10 +344,10 @@ import collection.JavaConversions._ Then("It should automatically link to tags") val taglinks = $("a[data-link-name=auto-linked-tag]") - taglinks.length should be(1) + taglinks.asScala.length should be(1) - taglinks(0).text should be("Northern Ireland") - taglinks(0).attribute("href") should endWith("/uk/northernireland") + taglinks.asScala(0).text should be("Northern Ireland") + taglinks.asScala(0).attribute("href") should endWith("/uk/northernireland") } } @@ -562,10 +562,10 @@ import collection.JavaConversions._ goTo("/world/2013/sep/15/obama-rouhani-united-nations-meeting") { browser => import browser._ Then("I should see twitter cards") - $("meta[name='twitter:site']").attributes("content").head should be("@guardian") - $("meta[name='twitter:card']").attributes("content").head should be("summary_large_image") - $("meta[name='twitter:app:url:googleplay']").attributes("content").head should startWith("guardian://www.theguardian.com/world") - $("meta[name='twitter:image']").attributes("content").head should include("2013/9/15/1379275549160/Irans-President-Hassan-Ro-010.jpg") + $("meta[name='twitter:site']").attributes("content").asScala.head should be("@guardian") + $("meta[name='twitter:card']").attributes("content").asScala.head should be("summary_large_image") + $("meta[name='twitter:app:url:googleplay']").attributes("content").asScala.head should startWith("guardian://www.theguardian.com/world") + $("meta[name='twitter:image']").attributes("content").asScala.head should include("2013/9/15/1379275549160/Irans-President-Hassan-Ro-010.jpg") } } @@ -574,9 +574,9 @@ import collection.JavaConversions._ goTo("/us-news/live/2016/nov/11/donald-trump-news-us-politics-live") { browser => import browser._ Then("I should still see a large image twitter card") - $("meta[name='twitter:site']").attributes("content").head should be("@guardian") - $("meta[name='twitter:card']").attributes("content").head should be("summary_large_image") - $("meta[name='twitter:app:url:googleplay']").attributes("content").head should startWith("guardian://www.theguardian.com/us-news") + $("meta[name='twitter:site']").attributes("content").asScala.head should be("@guardian") + $("meta[name='twitter:card']").attributes("content").asScala.head should be("summary_large_image") + $("meta[name='twitter:app:url:googleplay']").attributes("content").asScala.head should startWith("guardian://www.theguardian.com/us-news") } } @@ -608,11 +608,11 @@ import collection.JavaConversions._ $(".breadcrumb .signposting__item").size() should be(3) val link = browser.find(".breadcrumb .signposting__item a", withText().contains("Culture")) - link.length should be > 0 + link.asScala.length should be > 0 val link2 = browser.find(".breadcrumb .signposting__item a", withText().contains("Books")) - link2.length should be > 0 + link2.asScala.length should be > 0 val link3 = browser.find(".breadcrumb .signposting__item a", withText().contains("Orwell prize")) - link3.length should be > 0 + link3.asScala.length should be > 0 } Given("I am on a piece of content with a primary nav and a key woro") @@ -622,9 +622,9 @@ import collection.JavaConversions._ $(".breadcrumb .signposting__item").size() should be(2) val link = browser.find(".breadcrumb .signposting__item a", withText().contains("Opinion")) - link.length should be > 0 + link.asScala.length should be > 0 val link2 = browser.find(".breadcrumb .signposting__item a", withText().contains("Heritage")) - link2.length should be > 0 + link2.asScala.length should be > 0 } Given("I am on a piece of content with no primary nav and a no key words") @@ -634,7 +634,7 @@ import collection.JavaConversions._ $(".breadcrumb .signposting__item").size() should be(1) val link = browser.find(".breadcrumb .signposting__item a", withText().contains("Observer Ethical Awards")) - link.length should be > 0 + link.asScala.length should be > 0 } } diff --git a/article/test/SectionsNavigationFeatureTest.scala b/article/test/SectionsNavigationFeatureTest.scala index 25a57d87292c..a0df0f2671e6 100644 --- a/article/test/SectionsNavigationFeatureTest.scala +++ b/article/test/SectionsNavigationFeatureTest.scala @@ -1,7 +1,7 @@ package test import org.scalatest.{DoNotDiscover, Matchers, GivenWhenThen, FeatureSpec} -import collection.JavaConversions._ +import collection.JavaConverters._ import org.fluentlenium.core.filter.FilterConstructor._ import conf.Configuration @@ -21,7 +21,7 @@ import conf.Configuration val sections = browser.find("#footer-nav li a") - sections.length should be > 0 + sections.asScala.length should be > 0 And("a button to activate that list") browser.$(".navigation-toggle").attribute("href") should include("australia-mining-boom-end#footer-nav") @@ -58,19 +58,19 @@ import conf.Configuration Then("I should see a link to the contributors section") val contributors = browser.find(".l-footer li a", withText().contains("contributors")) - contributors.length should be > 0 + contributors.asScala.length should be > 0 And("a link to the contact us page") val contact = browser.find(".l-footer li a", withText().contains("contact")) - contact.length should be > 0 + contact.asScala.length should be > 0 And("a link to the about us page") val info = browser.find(".l-footer li a", withText().contains("about us")) - info.length should be > 0 + info.asScala.length should be > 0 And("a link to the complaints and corrections") val complaints = browser.find(".l-footer li a", withText().contains("complaints & corrections")) - complaints.length should be > 0 + complaints.asScala.length should be > 0 } } @@ -81,12 +81,12 @@ import conf.Configuration Then("I should see a link to the terms & Conditions in the page footer") val terms = browser.find(".l-footer li a", withText().contains("terms")) - terms.length should be > 0 + terms.asScala.length should be > 0 And("a link to the privacy policy page") val privacy = browser.find(".l-footer li a", withText().contains("privacy")) - privacy.length should be > 0 + privacy.asScala.length should be > 0 } } diff --git a/build.sbt b/build.sbt index ce061ed44dd0..264ba7479009 100644 --- a/build.sbt +++ b/build.sbt @@ -7,7 +7,7 @@ import com.gu.ProjectSettings._ val common = library("common").settings( libraryDependencies ++= Seq( - akkaAgent, + guBox, apacheCommonsMath3, awsCore, awsCloudwatch, @@ -32,7 +32,7 @@ val common = library("common").settings( rome, romeModules, scalaCheck, - scalajTime, + nScalaTime, ws, faciaFapiScalaClient, closureCompiler, diff --git a/commercial/app/CommercialLifecycle.scala b/commercial/app/CommercialLifecycle.scala index 638f7a6a0800..7ec6e74e27c6 100644 --- a/commercial/app/CommercialLifecycle.scala +++ b/commercial/app/CommercialLifecycle.scala @@ -64,7 +64,7 @@ class CommercialLifecycle( val msgPrefix = s"Fetching $feedName feed" log.info(s"$msgPrefix from ${fetcher.feedMetaData.url} ...") val eventualResponse = fetcher.fetch() - eventualResponse onFailure { + eventualResponse.failed.foreach { case e: SwitchOffException => log.warn(s"$msgPrefix failed: ${e.getMessage}") case NonFatal(e) => @@ -72,8 +72,8 @@ class CommercialLifecycle( e, toLogFields(feedName, "fetch", false)) } - eventualResponse onSuccess { - case response => + eventualResponse.foreach { + response => S3FeedStore.put(feedName, response.feed) logInfoWithCustomFields(s"$msgPrefix succeeded in ${response.duration}", toLogFields(feedName, "fetch", true, Some(response.duration.toSeconds))) @@ -88,7 +88,7 @@ class CommercialLifecycle( val msgPrefix = s"Parsing $feedName feed" log.info(s"$msgPrefix ...") val parsedFeed = parser.parse(S3FeedStore.get(parser.feedMetaData.name)) - parsedFeed onFailure { + parsedFeed.failed.foreach { case e: SwitchOffException => log.warn(s"$msgPrefix failed: ${e.getMessage}") case NonFatal(e) => @@ -96,8 +96,8 @@ class CommercialLifecycle( e, toLogFields(feedName, "parse", false)) } - parsedFeed onSuccess { - case feed => + parsedFeed.foreach { + feed => logInfoWithCustomFields(s"$msgPrefix succeeded: parsed ${feed.contents.size} $feedName in ${feed.parseDuration}", toLogFields(feedName, "parse", true, Some(feed.parseDuration.toSeconds), Some(feed.contents.size))) } @@ -134,7 +134,7 @@ class CommercialLifecycle( akkaAsync.after1s { - industries.refresh() onFailure { + industries.refresh().failed.foreach { case NonFatal(e) => log.warn(s"Failed to refresh job industries: ${e.getMessage}") } diff --git a/commercial/app/controllers/ContentApiOffersController.scala b/commercial/app/controllers/ContentApiOffersController.scala index 81043dd4b5e9..62a75545a65e 100644 --- a/commercial/app/controllers/ContentApiOffersController.scala +++ b/commercial/app/controllers/ContentApiOffersController.scala @@ -28,13 +28,13 @@ class ContentApiOffersController(contentApiClient: ContentApiClient, capiAgent: lookup.latestContentByKeyword(keyword, 8) }.getOrElse(Future.successful(Nil)) - latestContent onFailure { + latestContent.failed.foreach { case NonFatal(e) => log.error(s"Looking up content by keyword failed: ${e.getMessage}") } val specificContent: Future[Seq[model.ContentType]] = capiAgent.contentByShortUrls(specificIds) - specificContent onFailure { + specificContent.failed.foreach { case NonFatal(e) => log.error(s"Looking up content by short URL failed: ${e.getMessage}") } diff --git a/commercial/app/controllers/HostedContentController.scala b/commercial/app/controllers/HostedContentController.scala index 62eb480dab0e..8ed4d0383eee 100644 --- a/commercial/app/controllers/HostedContentController.scala +++ b/commercial/app/controllers/HostedContentController.scala @@ -66,7 +66,7 @@ class HostedContentController( val capiResponse = { val itemId = s"advertiser-content/$campaignName/$pageName" val response = contentApiClient.getResponse(baseQuery(itemId)) - response.onFailure { + response.failed.foreach { case NonFatal(e) => log.warn(s"Capi lookup of item '$itemId' failed: ${e.getMessage}", e) } response @@ -126,7 +126,7 @@ class HostedContentController( .pageSize(100) .orderBy("oldest") val response = contentApiClient.getResponse(query) - response.onFailure { + response.failed.foreach { case NonFatal(e) => log.warn(s"Capi lookup of item '$sectionId' failed: ${e.getMessage}", e) } response @@ -163,7 +163,7 @@ class HostedContentController( .pageSize(100) .orderBy("oldest") val response = contentApiClient.getResponse(query) - response.onFailure { + response.failed.foreach { case NonFatal(e) => log.warn(s"Capi lookup of item '$sectionId' failed: ${e.getMessage}", e) } response diff --git a/commercial/app/controllers/TrafficDriverController.scala b/commercial/app/controllers/TrafficDriverController.scala index b87829e3e9eb..22ed5fd1a0f7 100644 --- a/commercial/app/controllers/TrafficDriverController.scala +++ b/commercial/app/controllers/TrafficDriverController.scala @@ -27,7 +27,7 @@ class TrafficDriverController( val content: Future[Option[model.ContentType]] = capiAgent.contentByShortUrls(specificIds).map(_.headOption) - content onFailure { + content.failed.foreach { case NonFatal(e) => log.error( s"Looking up content by short URL failed: ${e.getMessage}" ) diff --git a/commercial/app/model/capi/CapiAgent.scala b/commercial/app/model/capi/CapiAgent.scala index f84a830c4ed3..a58044a99549 100644 --- a/commercial/app/model/capi/CapiAgent.scala +++ b/commercial/app/model/capi/CapiAgent.scala @@ -1,6 +1,7 @@ package commercial.model.capi -import common.{AkkaAgent, Logging} +import com.gu.Box +import common.Logging import contentapi.ContentApiClient import model.ContentType @@ -9,7 +10,7 @@ import scala.util.control.NonFatal class CapiAgent(contentApiClient: ContentApiClient) extends Logging { - private lazy val shortUrlAgent = AkkaAgent[Map[String, Option[ContentType]]](Map.empty) + private lazy val shortUrlAgent = Box[Map[String, Option[ContentType]]](Map.empty) private val lookup = new Lookup(contentApiClient) private lazy val cache = shortUrlAgent.get() diff --git a/commercial/app/model/feeds/FeedReader.scala b/commercial/app/model/feeds/FeedReader.scala index 3cb177ab5831..b66798d5a456 100644 --- a/commercial/app/model/feeds/FeedReader.scala +++ b/commercial/app/model/feeds/FeedReader.scala @@ -59,7 +59,7 @@ class FeedReader(wsClient: WSClient) extends Logging { } } - contents onFailure { + contents.failed.foreach { case NonFatal(e) => log.error(s"Failed to fetch feed contents.", e) recordLoad(-1) @@ -86,11 +86,11 @@ class FeedReader(wsClient: WSClient) extends Logging { (implicit ec: ExecutionContext): Future[Seq[T]] = { val contents = read(request)(parse) - contents onSuccess { - case items => log.info(s"Loaded ${items.size} ${request.feedName} from ${request.url}") + contents foreach { + items => log.info(s"Loaded ${items.size} ${request.feedName} from ${request.url}") } - contents onFailure { + contents.failed.foreach { case e: FeedSwitchOffException => log.warn(e.getMessage) case NonFatal(e) => log.error(s"Failed to read feed ${request.feedName} with URL ${request.url}", e) } diff --git a/commercial/app/model/merchandise/MerchandiseAgent.scala b/commercial/app/model/merchandise/MerchandiseAgent.scala index 52a085ec889a..d815edc17937 100644 --- a/commercial/app/model/merchandise/MerchandiseAgent.scala +++ b/commercial/app/model/merchandise/MerchandiseAgent.scala @@ -1,14 +1,15 @@ package commercial.model.merchandise +import com.gu.Box import commercial.model.Segment -import common.{AkkaAgent, Logging} +import common.Logging import scala.concurrent.Future import scala.util.Random trait MerchandiseAgent[T] extends Logging { - private lazy val agent = AkkaAgent[Seq[T]](Nil) + private lazy val agent = Box[Seq[T]](Nil) def available: Seq[T] = agent() diff --git a/commercial/app/model/merchandise/books/BookFinder.scala b/commercial/app/model/merchandise/books/BookFinder.scala index b25d770b89ab..675151df8fee 100644 --- a/commercial/app/model/merchandise/books/BookFinder.scala +++ b/commercial/app/model/merchandise/books/BookFinder.scala @@ -3,9 +3,10 @@ package commercial.model.merchandise.books import akka.actor.ActorSystem import akka.pattern.CircuitBreaker import akka.util.Timeout +import com.gu.Box import commercial.model.feeds.{FeedParseException, FeedReadException, FeedReader, FeedRequest} import commercial.model.merchandise.Book -import common.{AkkaAgent, Logging} +import common.Logging import conf.Configuration import conf.switches.Switches.BookLookupSwitch import play.api.libs.json._ @@ -27,7 +28,7 @@ class BookFinder(actorSystem: ActorSystem, magentoService: MagentoService) exten object BookAgent extends Logging { - private lazy val cache = AkkaAgent(Map.empty[String, JsValue]) + private lazy val cache = Box(Map.empty[String, JsValue]) def get(isbn: String)(implicit magentoService: MagentoService, executionContext: ExecutionContext): Option[JsValue] = { diff --git a/commercial/app/model/merchandise/events/LiveEventAgent.scala b/commercial/app/model/merchandise/events/LiveEventAgent.scala index aab6a960e24b..a470be16fb6d 100644 --- a/commercial/app/model/merchandise/events/LiveEventAgent.scala +++ b/commercial/app/model/merchandise/events/LiveEventAgent.scala @@ -2,8 +2,9 @@ package commercial.model.merchandise.events import java.lang.System._ +import com.gu.Box import commercial.model.feeds._ -import common.{AkkaAgent, Logging} +import common.Logging import conf.Configuration import commercial.model.merchandise.LiveEvent import play.api.libs.json.JsValue @@ -15,7 +16,7 @@ import scala.util.control.NonFatal class LiveEventAgent(wsClient: WSClient) extends Logging { - private lazy val liveEventAgent = AkkaAgent[Seq[LiveEvent]](Seq.empty) + private lazy val liveEventAgent = Box[Seq[LiveEvent]](Seq.empty) def specificLiveEvent(eventBriteId: String): Option[LiveEvent] = liveEventAgent.get.find(_.eventId == eventBriteId) diff --git a/commercial/app/model/merchandise/jobs/Industries.scala b/commercial/app/model/merchandise/jobs/Industries.scala index 65ac6625c765..b40da5bb0a2d 100644 --- a/commercial/app/model/merchandise/jobs/Industries.scala +++ b/commercial/app/model/merchandise/jobs/Industries.scala @@ -1,7 +1,7 @@ package commercial.model.merchandise.jobs +import com.gu.Box import commercial.model.capi.Lookup -import common.AkkaAgent import contentapi.ContentApiClient import scala.concurrent.{ExecutionContext, Future} @@ -41,7 +41,7 @@ object Industries { class Industries(contentApiClient: ContentApiClient) { private val lookup = new Lookup(contentApiClient) - private lazy val industryKeywordIds = AkkaAgent(Map.empty[Int, Seq[String]]) + private lazy val industryKeywordIds = Box(Map.empty[Int, Seq[String]]) def refresh()(implicit executionContext: ExecutionContext): Future[Iterable[Map[Int, Seq[String]]]] = Future.sequence { diff --git a/commercial/app/model/merchandise/soulmates/SoulmatesAgent.scala b/commercial/app/model/merchandise/soulmates/SoulmatesAgent.scala index 59a418450083..0da7cae01696 100644 --- a/commercial/app/model/merchandise/soulmates/SoulmatesAgent.scala +++ b/commercial/app/model/merchandise/soulmates/SoulmatesAgent.scala @@ -1,7 +1,7 @@ package commercial.model.merchandise.soulmates +import com.gu.Box import commercial.model.feeds.{FeedMetaData, ParsedFeed} -import common.AkkaAgent import commercial.model.merchandise.{Man, Member, Woman} import scala.concurrent.{ExecutionContext, Future} @@ -11,7 +11,7 @@ case class SoulmatesAgent(groupName: String, feed: SoulmatesFeed, filter: Seq[Member] => Seq[Member]) { - private lazy val agent = AkkaAgent[Seq[Member]](Nil) + private lazy val agent = Box[Seq[Member]](Nil) def refresh(feedMetaData: FeedMetaData, feedContent: => Option[String]) (implicit ec: ExecutionContext): Future[ParsedFeed[Member]] = { diff --git a/common/app/assets/DiscussionAssets.scala b/common/app/assets/DiscussionAssets.scala index 51d495b88aa7..85cfce1d72e8 100644 --- a/common/app/assets/DiscussionAssets.scala +++ b/common/app/assets/DiscussionAssets.scala @@ -3,7 +3,8 @@ package assets import java.net.URI import app.LifecycleComponent -import common.{AkkaAgent, GuardianConfiguration, JobScheduler, Logging} +import com.gu.Box +import common.{GuardianConfiguration, JobScheduler, Logging} import conf.switches.Switches import play.api.libs.ws.{WSClient, WSResponse} @@ -100,7 +101,7 @@ class DiscussionExternalAssetsLifecycle( } object DiscussionAssetsMap { - private lazy val agent = AkkaAgent[Map[String, String]](Map.empty) + private lazy val agent = Box[Map[String, String]](Map.empty) def alter (map: Map[String, String], baseURI: URI): Future[Map[String, String]] = { agent.alter(map.mapValues(value => baseURI.resolve(value).toString)) diff --git a/common/app/commercial/targeting/CampaignAgent.scala b/common/app/commercial/targeting/CampaignAgent.scala index fc7203cb8e1a..ad9ef9d6245d 100644 --- a/common/app/commercial/targeting/CampaignAgent.scala +++ b/common/app/commercial/targeting/CampaignAgent.scala @@ -1,5 +1,6 @@ package commercial.targeting +import com.gu.Box import common._ import com.gu.targeting.client.{Campaign, CampaignCache} import conf.Configuration @@ -8,7 +9,7 @@ import scala.concurrent.{ExecutionContext, Future} import conf.switches.Switches.Targeting object CampaignAgent extends Logging { - private val agent = AkkaAgent[CampaignCache](CampaignCache(Nil, None)) + private val agent = Box[CampaignCache](CampaignCache(Nil, None)) def refresh()(implicit executionContext: ExecutionContext): Future[Unit] = { // The maximum number of campaigns which will be fetched. If there are too many campaigns additional campaigns will be truncated. diff --git a/common/app/common/AutoRefresh.scala b/common/app/common/AutoRefresh.scala index 8e0209e3304b..135f671b4a3c 100644 --- a/common/app/common/AutoRefresh.scala +++ b/common/app/common/AutoRefresh.scala @@ -1,16 +1,16 @@ package common import scala.concurrent.duration.FiniteDuration -import akka.agent.Agent import akka.actor.{ActorSystem, Cancellable} import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success} +import com.gu.Box /** Simple class for repeatedly updating a value on a schedule */ abstract class AutoRefresh[A](initialDelay: FiniteDuration, interval: FiniteDuration) extends Logging { - private lazy val agent = AkkaAgent[Option[A]](None) + private lazy val agent = Box[Option[A]](None) @volatile private var subscription: Option[Cancellable] = None diff --git a/common/app/common/HTML.scala b/common/app/common/HTML.scala index 8c81ca522ac1..0fea0e0623ac 100644 --- a/common/app/common/HTML.scala +++ b/common/app/common/HTML.scala @@ -3,7 +3,7 @@ package common import org.apache.commons.lang.StringEscapeUtils import org.jsoup.Jsoup import org.jsoup.safety.Whitelist -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ object HTML { @@ -13,8 +13,9 @@ object HTML { Jsoup.parse(html) .select("body") .iterator + .asScala .toList - .flatMap(_.children().take(n)) + .flatMap(_.children().asScala.take(n)) .map(_.toString) .mkString("") } diff --git a/common/app/common/InlineStyles.scala b/common/app/common/InlineStyles.scala index c68d0132daa6..cf11a5b93288 100644 --- a/common/app/common/InlineStyles.scala +++ b/common/app/common/InlineStyles.scala @@ -10,7 +10,7 @@ import org.w3c.dom.css.{CSSRuleList, CSSRule => W3CSSRule} import play.api.Logger import play.twirl.api.Html -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.collection.immutable.ListMap import scala.util.{Failure, Success} @@ -74,19 +74,19 @@ object InlineStyles { val document = Jsoup.parse(html.body) val (inline, head) = styles(document) - document.getElementsByTag("head").headOption map { el => - el.getElementsByTag("style").map(_.remove) + document.getElementsByTag("head").asScala.headOption map { el => + el.getElementsByTag("style").asScala.foreach(_.remove) head.map(css => el.appendChild(document.createElement("style").text(css))) } inline.sortBy(_.specifity).foreach { rule => - document.select(rule.selector) foreach(el => el.attr("style", mergeStyles(rule, el.attr("style")))) + document.select(rule.selector).asScala.foreach(el => el.attr("style", mergeStyles(rule, el.attr("style")))) } // Outlook ignores styles with !important so we need to strip that out. // So this doesn't change which styles take effect, we also sort styles // so that all important styles appear to the right of all non-important styles. - document.getAllElements.foreach { el => + document.getAllElements.asScala.foreach { el => el.attr("style", sortStyles(el.attr("style")).replace(" !important", "")) } @@ -100,7 +100,7 @@ object InlineStyles { * The first item is the styles that should stay in the head, the second is everything that should be inlined. */ def styles(document: Document): (Seq[CSSRule], Seq[String]) = { - document.getElementsByTag("style").foldLeft((Seq.empty[CSSRule], Seq.empty[String])) { case ((inline, head), element) => + document.getElementsByTag("style").asScala.foldLeft((Seq.empty[CSSRule], Seq.empty[String])) { case ((inline, head), element) => val source = new InputSource(new StringReader(element.html)) Retry(3)(cssParser.parseStyleSheet(source, null, null)) { (exception, attemptNumber) => diff --git a/common/app/common/LinkTo.scala b/common/app/common/LinkTo.scala index 4f3c56739c32..9f394a41e3f3 100644 --- a/common/app/common/LinkTo.scala +++ b/common/app/common/LinkTo.scala @@ -8,7 +8,7 @@ import org.jsoup.Jsoup import play.api.libs.json.Json import play.api.mvc.{AnyContent, Request, RequestHeader, Result} import play.twirl.api.Html -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ /* * Builds absolute links to the core site (www.theguardian.com) @@ -77,7 +77,7 @@ object LinkTo extends LinkTo { // we can assume www.theguardian.com here as this happens before any cleaning def countLinks(html: String): LinkCounts = { - val links = Jsoup.parseBodyFragment(html).getElementsByTag("a").flatMap(a => Option(a.attr("href"))) + val links = Jsoup.parseBodyFragment(html).getElementsByTag("a").asScala.flatMap(a => Option(a.attr("href"))) val guardianLinksCount = links.count(_ contains "www.theguardian.com") LinkCounts( internal = guardianLinksCount, diff --git a/common/app/common/Properties.scala b/common/app/common/Properties.scala index 50a67bb4ad87..83be6a2e5f1a 100644 --- a/common/app/common/Properties.scala +++ b/common/app/common/Properties.scala @@ -2,7 +2,7 @@ package common import java.io.{File, FileInputStream, InputStream} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import java.net.URL import java.nio.charset.Charset @@ -15,7 +15,7 @@ object Properties extends AutomaticResourceManagement { def apply(is: InputStream): Map[String, String] = { val properties = new java.util.Properties() withCloseable(is) { properties load _ } - properties.toMap + properties.asScala.toMap } def apply(text: String): Map[String, String] = apply(IOUtils.toInputStream(text, Charset.defaultCharset())) diff --git a/common/app/common/TrailsToRss.scala b/common/app/common/TrailsToRss.scala index 9ec3fead1816..fcd9ac08543a 100644 --- a/common/app/common/TrailsToRss.scala +++ b/common/app/common/TrailsToRss.scala @@ -16,7 +16,7 @@ import org.jsoup.Jsoup import play.api.mvc.RequestHeader import views.support.{Item140, Item460, Profile} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.collection.JavaConverters._ object TrailsToRss extends implicits.Collections { @@ -119,7 +119,7 @@ object TrailsToRss extends implicits.Collections { entry.setDescription(description) entry.setCategories(categories) - entry.setModules(new java.util.ArrayList(mediaModules ++ Seq(dc))) + entry.setModules(new java.util.ArrayList((mediaModules ++ Seq(dc)).asJava)) entry }.asJava @@ -224,7 +224,7 @@ object TrailsToRss extends implicits.Collections { entry.setLink(webUrl) entry.setDescription(description) entry.setCategories(categories) - entry.setModules(new java.util.ArrayList(mediaModules ++ Seq(dc))) + entry.setModules(new java.util.ArrayList((mediaModules ++ Seq(dc)).asJava)) entry }.asJava diff --git a/common/app/common/akka.scala b/common/app/common/akka.scala index 8c44de789f2e..db8010eac0a8 100644 --- a/common/app/common/akka.scala +++ b/common/app/common/akka.scala @@ -1,18 +1,11 @@ package common -import akka.agent.Agent - import scala.concurrent.duration._ import play.api.{Environment, Mode} import scala.concurrent.ExecutionContext import akka.actor.ActorSystem -object AkkaAgent { - implicit lazy val executionContext: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global //TODO - def apply[T](value: T): Agent[T] = Agent(value) -} - class AkkaAsync(env: Environment, actorSystem: ActorSystem) { implicit val ec: ExecutionContext = actorSystem.dispatcher diff --git a/common/app/common/configuration.scala b/common/app/common/configuration.scala index d0a1e673f12f..5db5a9ddbaae 100644 --- a/common/app/common/configuration.scala +++ b/common/app/common/configuration.scala @@ -13,7 +13,7 @@ import conf.switches.Switches import conf.{Configuration, Static} import org.apache.commons.io.IOUtils -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.duration._ import scala.util.{Failure, Success, Try} @@ -98,7 +98,7 @@ object GuardianConfiguration extends Logging { def getMandatoryStringProperty: (String) => String = getMandatoryProperty(conf.getString)_ def getIntegerProperty: (String) => Option[Int] = getProperty(conf.getInt)_ - def getPropertyNames: Seq[String] = conf.entrySet.toSet.map((_.getKey): Entry[String, _] => String).toSeq + def getPropertyNames: Seq[String] = conf.entrySet.asScala.toSet.map((_.getKey): Entry[String, _] => String).toSeq def getStringPropertiesSplitByComma(propertyName: String): List[String] = { getStringProperty(propertyName) match { case Some(property) => (property split ",").toList diff --git a/common/app/common/dfp/DfpAgent.scala b/common/app/common/dfp/DfpAgent.scala index cf1e69224964..f87a4b15c34d 100644 --- a/common/app/common/dfp/DfpAgent.scala +++ b/common/app/common/dfp/DfpAgent.scala @@ -1,7 +1,6 @@ package common.dfp -import akka.agent.Agent -import common._ +import com.gu.Box import conf.Configuration.commercial._ import conf.Configuration.environment import play.api.libs.json.Json @@ -18,11 +17,11 @@ object DfpAgent override protected val environmentIsProd: Boolean = environment.isProd - private lazy val inlineMerchandisingTagsAgent = AkkaAgent[InlineMerchandisingTagSet](InlineMerchandisingTagSet()) - private lazy val targetedHighMerchandisingLineItemsAgent = AkkaAgent[Seq[HighMerchandisingLineItem]](Seq.empty) - private lazy val pageskinnedAdUnitAgent = AkkaAgent[Seq[PageSkinSponsorship]](Nil) - private lazy val lineItemAgent = AkkaAgent[Map[AdSlot, Seq[GuLineItem]]](Map.empty) - private lazy val takeoverWithEmptyMPUsAgent = AkkaAgent[Seq[TakeoverWithEmptyMPUs]](Nil) + private lazy val inlineMerchandisingTagsAgent = Box[InlineMerchandisingTagSet](InlineMerchandisingTagSet()) + private lazy val targetedHighMerchandisingLineItemsAgent = Box[Seq[HighMerchandisingLineItem]](Seq.empty) + private lazy val pageskinnedAdUnitAgent = Box[Seq[PageSkinSponsorship]](Nil) + private lazy val lineItemAgent = Box[Map[AdSlot, Seq[GuLineItem]]](Map.empty) + private lazy val takeoverWithEmptyMPUsAgent = Box[Seq[TakeoverWithEmptyMPUs]](Nil) protected def inlineMerchandisingTargetedTags: InlineMerchandisingTagSet = inlineMerchandisingTagsAgent get() protected def targetedHighMerchandisingLineItems: Seq[HighMerchandisingLineItem] = targetedHighMerchandisingLineItemsAgent get() @@ -33,7 +32,7 @@ object DfpAgent private def stringFromS3(key: String): Option[String] = S3.get(key)(UTF8) - private def update[T](agent: Agent[Seq[T]])(freshData: => Seq[T]) { + private def update[T](agent: Box[Seq[T]])(freshData: => Seq[T]) { if (freshData.nonEmpty) { agent send freshData } diff --git a/common/app/common/jobs.scala b/common/app/common/jobs.scala index 07bee75e09a5..a937cfb787fe 100644 --- a/common/app/common/jobs.scala +++ b/common/app/common/jobs.scala @@ -8,12 +8,13 @@ import play.api.Mode.Test import scala.collection.mutable import scala.concurrent.Future import scala.concurrent.duration.Duration +import com.gu.Box import scala.util.{Failure, Success} object JobsState { implicit val global = scala.concurrent.ExecutionContext.global val jobs = mutable.Map[String, () => Future[_]]() - val outstanding = akka.agent.Agent(Map[String,Int]().withDefaultValue(0)) + val outstanding = Box(Map[String,Int]().withDefaultValue(0)) } class FunctionJob extends Job with Logging { diff --git a/common/app/common/metrics.scala b/common/app/common/metrics.scala index f1b2c1d7a384..efeb4269984b 100644 --- a/common/app/common/metrics.scala +++ b/common/app/common/metrics.scala @@ -12,7 +12,7 @@ import model.ApplicationIdentity import model.diagnostics.CloudWatch import play.api.inject.ApplicationLifecycle -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} @@ -35,7 +35,7 @@ object SystemMetrics extends implicits.Numbers { } } - lazy val garbageCollectors: Seq[GcRateMetric] = ManagementFactory.getGarbageCollectorMXBeans.map(new GcRateMetric(_)) + lazy val garbageCollectors: Seq[GcRateMetric] = ManagementFactory.getGarbageCollectorMXBeans.asScala.map(new GcRateMetric(_)) val MaxHeapMemoryMetric = GaugeMetric( name = "max-heap-memory", diff --git a/common/app/conf/HealthCheck.scala b/common/app/conf/HealthCheck.scala index f3478ad315dd..583b3e675ae5 100644 --- a/common/app/conf/HealthCheck.scala +++ b/common/app/conf/HealthCheck.scala @@ -1,12 +1,11 @@ package conf -import akka.agent.Agent import app.LifecycleComponent import common._ import org.joda.time.DateTime import play.api.libs.ws.{WSClient, WSResponse} import play.api.mvc._ - +import com.gu.Box import scala.concurrent.{ExecutionContext, Future} import scala.concurrent.duration._ import scala.util.control.NonFatal @@ -116,7 +115,7 @@ private[conf] class HealthCheckCache(preconditionMaybe: Option[HealthCheckPrecon (implicit executionContext: ExecutionContext) extends HealthCheckFetcher { - protected val cache: Agent[List[HealthCheckResult]] = AkkaAgent[List[HealthCheckResult]](List[HealthCheckResult]()) + protected val cache: Box[List[HealthCheckResult]] = Box[List[HealthCheckResult]](List[HealthCheckResult]()) def get(): List[HealthCheckResult] = cache.get() def refresh(port: Int, healthChecks: SingleHealthCheck*): Future[List[HealthCheckResult]] = { diff --git a/common/app/conf/switches/Switches.scala b/common/app/conf/switches/Switches.scala index 6dfec0217f1b..f326a4f6b31c 100644 --- a/common/app/conf/switches/Switches.scala +++ b/common/app/conf/switches/Switches.scala @@ -2,6 +2,7 @@ package conf.switches import java.util.concurrent.TimeoutException +import com.gu.Box import common._ import org.joda.time.{DateTime, DateTimeZone, Days, LocalDate} @@ -124,12 +125,9 @@ object Switch { exposeClientSide ) - val switches = AkkaAgent[List[Switch]](Nil) + val switches = Box[List[Switch]](Nil) def allSwitches: Seq[Switch] = switches.get() - // the agent won't immediately return its switches - def eventuallyAllSwitches: Future[List[Switch]] = switches.future() - case class Expiry(daysToExpiry: Option[Int], expiresSoon: Boolean, hasExpired: Boolean) def expiry(switch: Switch, today: LocalDate = new DateTime(DateTimeZone.forID("Europe/London")).toLocalDate): Expiry = { // We assume expiration datetime is set to London time @@ -165,8 +163,6 @@ with JournalismSwitches { def all: Seq[Switch] = Switch.allSwitches - def eventuallyAll: Future[List[Switch]] = Switch.eventuallyAllSwitches - def grouped: List[(SwitchGroup, Seq[Switch])] = { val sortedSwitches = all.groupBy(_.group).map { case (key, value) => (key, value.sortBy(_.name)) } sortedSwitches.toList.sortBy(_._1.name) diff --git a/common/app/contentapi/ContentApiClient.scala b/common/app/contentapi/ContentApiClient.scala index 441736f7da4b..ad0979acbe85 100644 --- a/common/app/contentapi/ContentApiClient.scala +++ b/common/app/contentapi/ContentApiClient.scala @@ -12,7 +12,7 @@ import conf.Configuration.contentApi import conf.switches.Switches.CircuitBreakerSwitch import model.{Content, Trail} import org.joda.time.DateTime -import org.scala_tools.time.Implicits._ +import com.github.nscala_time.time.Implicits._ import scala.concurrent.duration.{Duration, MILLISECONDS} import scala.concurrent.{ExecutionContext, Future} @@ -104,7 +104,7 @@ trait MonitoredContentApiClientLogic extends ContentApiClientLogic with ApiQuery val futureContent = _httpClient.GET(url, headers) map { response: Response => HttpResponse(response.body, response.status, response.statusText) } - futureContent.onFailure{ case t => + futureContent.failed.foreach { t => val tryDecodedUrl: String = Try(java.net.URLDecoder.decode(url, "UTF-8")).getOrElse(url) log.error(s"$t: $tryDecodedUrl")} futureContent diff --git a/common/app/contentapi/SectionsLookUp.scala b/common/app/contentapi/SectionsLookUp.scala index 631efba84a09..8307832c0efb 100644 --- a/common/app/contentapi/SectionsLookUp.scala +++ b/common/app/contentapi/SectionsLookUp.scala @@ -1,13 +1,14 @@ package contentapi +import com.gu.Box import com.gu.contentapi.client.model.v1.Section -import common.{AkkaAgent, Logging} +import common.Logging import scala.concurrent.ExecutionContext import scala.util.{Failure, Success} class SectionsLookUp(contentApiClient: ContentApiClient) extends Logging { - private val sections = AkkaAgent[Option[Map[String, Section]]](None) + private val sections = Box[Option[Map[String, Section]]](None) def refresh()(implicit executionContext: ExecutionContext): Unit = { contentApiClient.getResponse(contentApiClient.sections) onComplete { diff --git a/common/app/contentapi/http.scala b/common/app/contentapi/http.scala index dd4e52671586..fa93935f0162 100644 --- a/common/app/contentapi/http.scala +++ b/common/app/contentapi/http.scala @@ -36,13 +36,13 @@ class CapiHttpClient(wsClient: WSClient)(implicit executionContext: ExecutionCon val response = request.withHttpHeaders(headers.toSeq: _*).withRequestTimeout(contentApiTimeout).get() // record metrics - response.onSuccess { + response.foreach { case r if r.status == 404 => ContentApi404Metric.increment() case r if r.status == 200 => ContentApiMetrics.HttpLatencyTimingMetric.recordDuration(currentTimeMillis - start) case _ => } - response.onFailure { + response.failed.foreach { case e: TimeoutException => log.warn(s"Content API TimeoutException for $url in ${currentTimeMillis - start}: $e") ContentApiMetrics.HttpTimeoutCountMetric.increment() diff --git a/common/app/dev/DevAssetsController.scala b/common/app/dev/DevAssetsController.scala index 2756c641839f..78b6d45c5580 100644 --- a/common/app/dev/DevAssetsController.scala +++ b/common/app/dev/DevAssetsController.scala @@ -54,7 +54,7 @@ class DevAssetsController(val environment: Environment, val controllerComponents val result = Result( ResponseHeader(OK, Map(CONTENT_TYPE -> contentType)), HttpEntity.Streamed( - data = StreamConverters.fromInputStream(resolved.openStream), + data = StreamConverters.fromInputStream(resolved.openStream _), contentLength = file.map(_.length), contentType = Some(contentType)) ) diff --git a/common/app/implicits/Dates.scala b/common/app/implicits/Dates.scala index 50bafb898abc..0a5e7e600d0c 100644 --- a/common/app/implicits/Dates.scala +++ b/common/app/implicits/Dates.scala @@ -3,9 +3,9 @@ package implicits import com.gu.contentapi.client.model.v1.CapiDateTime import common.Edition import java.time.Instant -import org.joda.time.{DateTime, Days, LocalDate, Duration => JodaDuration} -import org.scala_tools.time.Imports._ -import org.joda.time.format.ISODateTimeFormat + +import org.joda.time.{DateTime, DateTimeZone, Days, LocalDate, Period, Duration => JodaDuration} +import org.joda.time.format.{DateTimeFormat, ISODateTimeFormat} import scala.concurrent.duration.Duration diff --git a/common/app/implicits/FaciaContentFrontendHelpers.scala b/common/app/implicits/FaciaContentFrontendHelpers.scala index 4227d8baf6a6..8c866e8bd912 100644 --- a/common/app/implicits/FaciaContentFrontendHelpers.scala +++ b/common/app/implicits/FaciaContentFrontendHelpers.scala @@ -5,10 +5,9 @@ import implicits.Dates._ import model._ import model.content.{MediaAssetPlatform, MediaAtom} import model.pressed._ -import org.joda.time.DateTime +import org.joda.time.{DateTime, Period, PeriodType} import org.jsoup.Jsoup -import org.scala_tools.time.Imports._ - +import com.github.nscala_time.time.Implicits._ import scala.util.Try object FaciaContentFrontendHelpers { diff --git a/common/app/metrics/FrontendMetrics.scala b/common/app/metrics/FrontendMetrics.scala index 3644ab33e05c..83e8111f3704 100644 --- a/common/app/metrics/FrontendMetrics.scala +++ b/common/app/metrics/FrontendMetrics.scala @@ -2,9 +2,8 @@ package metrics import java.util.concurrent.atomic.AtomicLong -import akka.agent.Agent +import com.gu.Box import com.amazonaws.services.cloudwatch.model.StandardUnit -import common.AkkaAgent import model.diagnostics.CloudWatch import org.joda.time.DateTime import scala.concurrent.Future @@ -51,7 +50,7 @@ final case class SimpleMetric(override val name: String, datapoint: SimpleDataPo // Also, MetricUploader will upload in batches. final case class MetricUploader(namespace: String) { - private val datapoints: Agent[List[SimpleMetric]] = AkkaAgent(List.empty) + private val datapoints: Box[List[SimpleMetric]] = Box(List.empty) def put(metrics: Map[String, Double]): Unit = { val timedMetrics = metrics.map { case (key, value) => @@ -119,10 +118,7 @@ case class DurationDataPoint(value: Double, time: Option[DateTime] = None) exten final case class DurationMetric(override val name: String, override val metricUnit: StandardUnit) extends FrontendMetric { - private val dataPoints: Agent[List[DataPoint]] = AkkaAgent(List[DurationDataPoint]()) - - // For tests. - def getDataFuture: Future[List[DataPoint]] = dataPoints.future() + private val dataPoints: Box[List[DataPoint]] = Box(List[DurationDataPoint]()) override def getAndResetDataPoints: List[DataPoint] = { val points = dataPoints.get() @@ -144,7 +140,7 @@ case class SampledDataPoint(value: Double, sampleTime: DateTime) extends DataPoi final case class SamplerMetric(override val name: String, override val metricUnit: StandardUnit) extends FrontendMetric { - private val dataPoints: Agent[List[SampledDataPoint]] = AkkaAgent(List[SampledDataPoint]()) + private val dataPoints: Box[List[SampledDataPoint]] = Box(List[SampledDataPoint]()) override def getAndResetDataPoints: List[DataPoint] = { val points = dataPoints.get() @@ -155,4 +151,4 @@ final case class SamplerMetric(override val name: String, override val metricUni def recordSample(sampleValue: Double, sampleTime: DateTime): Future[List[SampledDataPoint]] = dataPoints.alter(SampledDataPoint(sampleValue, sampleTime) :: _) override def isEmpty: Boolean = dataPoints.get().isEmpty -} \ No newline at end of file +} diff --git a/common/app/model/Cached.scala b/common/app/model/Cached.scala index 74b912464c30..2da3ec1e5a12 100644 --- a/common/app/model/Cached.scala +++ b/common/app/model/Cached.scala @@ -2,7 +2,7 @@ package model import conf.switches.Switches.LongCacheSwitch import org.joda.time.DateTime -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Implicits._ import play.api.http.Writeable import play.api.mvc._ import scala.math.{max, min} diff --git a/common/app/model/content.scala b/common/app/model/content.scala index 3866eaea1b35..ecd64d509bef 100644 --- a/common/app/model/content.scala +++ b/common/app/model/content.scala @@ -15,10 +15,10 @@ import model.content.{Atoms, MediaAssetPlatform, MediaAtom, Quiz} import model.pressed._ import org.jsoup.Jsoup import org.jsoup.safety.Whitelist -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ import play.api.libs.json._ import views.support._ -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.util.Try import implicits.Booleans._ @@ -197,7 +197,7 @@ final case class Content( lazy val linkCounts = LinkTo.countLinks(fields.body) + fields.standfirst.map(LinkTo.countLinks).getOrElse(LinkCounts.None) - lazy val mainMediaVideo = Jsoup.parseBodyFragment(fields.main).body.getElementsByClass("element-video").headOption + lazy val mainMediaVideo = Jsoup.parseBodyFragment(fields.main).body.getElementsByClass("element-video").asScala.headOption lazy val mainVideoCanonicalPath: Option[String] = mainMediaVideo.flatMap(video => { video.attr("data-canonical-url") match { @@ -498,17 +498,17 @@ final case class Article ( val isTheMinute: Boolean = content.tags.isTheMinuteArticle val isImmersive: Boolean = content.isImmersive val isPhotoEssay: Boolean = content.isPhotoEssay - lazy val hasVideoAtTop: Boolean = soupedBody.body().children().headOption + lazy val hasVideoAtTop: Boolean = soupedBody.body().children().asScala.headOption .exists(e => e.hasClass("gu-video") && e.tagName() == "video") lazy val hasSupporting: Boolean = { val supportingClasses = Set("element--showcase", "element--supporting", "element--thumbnail") - val leftColElements = soupedBody.body().select("body > *").find(_.classNames.intersect(supportingClasses).nonEmpty) + val leftColElements = soupedBody.body().select("body > *").asScala.find(_.classNames.asScala.intersect(supportingClasses).nonEmpty) leftColElements.isDefined } private lazy val soupedBody = Jsoup.parseBodyFragment(fields.body) - lazy val hasKeyEvents: Boolean = soupedBody.body().select(".is-key-event").nonEmpty + lazy val hasKeyEvents: Boolean = soupedBody.body().select(".is-key-event").asScala.nonEmpty lazy val isSport: Boolean = tags.tags.exists(_.id == "sport/sport") lazy val blocks = content.fields.blocks @@ -819,7 +819,7 @@ final case class Interactive( lazy val fallbackEl = { val noscriptEls = Jsoup.parseBodyFragment(fields.body).getElementsByTag("noscript") - if (noscriptEls.nonEmpty) { + if (noscriptEls.asScala.nonEmpty) { noscriptEls.html() } else { Jsoup.parseBodyFragment(fields.body).getElementsByTag("figure").html() diff --git a/common/app/model/diagnostics/CloudWatch.scala b/common/app/model/diagnostics/CloudWatch.scala index 9463647e1faa..c9ee742abbe5 100644 --- a/common/app/model/diagnostics/CloudWatch.scala +++ b/common/app/model/diagnostics/CloudWatch.scala @@ -8,7 +8,7 @@ import conf.Configuration import conf.Configuration._ import metrics.{FrontendMetric, FrontendStatisticSet} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ trait CloudWatch extends Logging { @@ -65,13 +65,14 @@ trait CloudWatch extends Logging { val request = new PutMetricDataRequest() .withNamespace(metricNamespace) .withMetricData { - for(metricStatistic <- metricsAsStatistics) yield { + val metricDatum = for(metricStatistic <- metricsAsStatistics) yield { new MetricDatum() .withStatisticValues(frontendMetricToStatisticSet(metricStatistic)) .withUnit(metricStatistic.unit) .withMetricName(metricStatistic.name) - .withDimensions(dimensions) + .withDimensions(dimensions.asJava) } + metricDatum.asJava } CloudWatch.cloudwatch.foreach(_.putMetricDataAsync(request, AsyncHandlerForMetric(metricsAsStatistics))) } diff --git a/common/app/model/meta.scala b/common/app/model/meta.scala index 1b6737450c69..1f10c8406529 100644 --- a/common/app/model/meta.scala +++ b/common/app/model/meta.scala @@ -14,7 +14,7 @@ import model.liveblog.Blocks import model.meta.{Guardian, LinkedData, PotentialAction, WebPage} import org.apache.commons.lang3.StringUtils import org.joda.time.DateTime -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Implicits._ import play.api.libs.json.{JsBoolean, JsString, JsValue} import play.api.mvc.RequestHeader import play.twirl.api.Html diff --git a/common/app/model/trails.scala b/common/app/model/trails.scala index 40500f302d81..ed9dae6b7d1b 100644 --- a/common/app/model/trails.scala +++ b/common/app/model/trails.scala @@ -3,7 +3,7 @@ package model import com.gu.contentapi.client.model.{v1 => contentapi} import implicits.Dates._ import org.joda.time.DateTime -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Implicits._ import play.api.libs.json.{JsBoolean, JsString, JsValue, Json} import play.api.mvc.RequestHeader import views.support.{ImgSrc, Naked} diff --git a/common/app/services/ConfigAgentTrait.scala b/common/app/services/ConfigAgentTrait.scala index 7fd5d36b893d..7253729dd49f 100644 --- a/common/app/services/ConfigAgentTrait.scala +++ b/common/app/services/ConfigAgentTrait.scala @@ -2,6 +2,7 @@ package services import akka.util.Timeout import app.LifecycleComponent +import com.gu.Box import com.gu.facia.api.models.{Front, _} import com.gu.facia.client.ApiClient import com.gu.facia.client.models.{ConfigJson, FrontJson} @@ -21,7 +22,7 @@ case class CollectionConfigWithId(id: String, config: CollectionConfig) object ConfigAgent extends Logging { implicit lazy val alterTimeout: Timeout = Configuration.faciatool.configBeforePressTimeout.millis - private lazy val configAgent = AkkaAgent[Option[ConfigJson]](None) + private lazy val configAgent = Box[Option[ConfigJson]](None) def isLoaded(): Boolean = configAgent.get().isDefined @@ -79,10 +80,6 @@ object ConfigAgent extends Logging { def getConfig(id: String): Option[CollectionConfig] = configAgent.get().flatMap(_.collections.get(id).map(CollectionConfig.make)) - def getConfigAfterUpdates(id: String)(implicit ec: ExecutionContext): Future[Option[CollectionConfig]] = - configAgent.future() - .map(_.flatMap(_.collections.get(id)).map(CollectionConfig.make)) - def getAllCollectionIds: List[String] = { val config = configAgent.get() config.map(_.collections.keys.toList).getOrElse(Nil) diff --git a/common/app/services/ophan/SurgingContentAgent.scala b/common/app/services/ophan/SurgingContentAgent.scala index 4ca4319fe34e..54b07405b62d 100644 --- a/common/app/services/ophan/SurgingContentAgent.scala +++ b/common/app/services/ophan/SurgingContentAgent.scala @@ -1,6 +1,7 @@ package services.ophan import app.LifecycleComponent +import com.gu.Box import com.gu.commercial.display.SurgeLookupService import common._ import org.joda.time.DateTime @@ -12,7 +13,7 @@ import scala.concurrent.{ExecutionContext, Future} object SurgingContentAgent extends SurgeLookupService with Logging { - private val agent = AkkaAgent[SurgingContent](SurgingContent()) + private val agent = Box[SurgingContent](SurgingContent()) def update(implicit ophanApi: OphanApi, executionContext: ExecutionContext): Unit = { log.info("Refreshing surging content.") diff --git a/common/app/services/repositories.scala b/common/app/services/repositories.scala index 06a7f0723bf1..74f9f9c478f3 100644 --- a/common/app/services/repositories.scala +++ b/common/app/services/repositories.scala @@ -7,7 +7,7 @@ import contentapi.{ContentApiClient, QueryDefaults, SectionTagLookUp, SectionsLo import implicits.Collections import model._ import org.joda.time.DateTime -import org.scala_tools.time.Implicits._ +import com.github.nscala_time.time.Implicits._ import play.api.mvc.{RequestHeader, Result => PlayResult} import scala.concurrent.Future diff --git a/common/app/views/support/HtmlCleaner.scala b/common/app/views/support/HtmlCleaner.scala index 4bbbba9cdfb9..4ba962aa8df4 100644 --- a/common/app/views/support/HtmlCleaner.scala +++ b/common/app/views/support/HtmlCleaner.scala @@ -15,7 +15,7 @@ import org.jsoup.nodes.{Document, Element, TextNode} import play.api.mvc.RequestHeader import play.twirl.api.HtmlFormat -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.util.Try trait HtmlCleaner { @@ -27,8 +27,8 @@ object BlockNumberCleaner extends HtmlCleaner { private val Block = """""".r override def clean(document: Document): Document = { - document.getAllElements.foreach { element => - val blockComments = element.childNodes.flatMap { node => + document.getAllElements.asScala.foreach { element => + val blockComments = element.childNodes.asScala.flatMap { node => node.toString.trim match { case Block(num) => Option(node.nextSibling).foreach(_.attr("id", s"block-$num")) @@ -45,7 +45,7 @@ object BlockNumberCleaner extends HtmlCleaner { object BlockquoteCleaner extends HtmlCleaner { override def clean(document: Document): Document = { - val quotedBlockquotes = document.getElementsByTag("blockquote").filter(_.hasClass("quoted")) + val quotedBlockquotes = document.getElementsByTag("blockquote").asScala.filter(_.hasClass("quoted")) val quoteSvg = views.html.fragments.inlineSvg("quote", "icon").toString() val wrapBlockquoteChildren = (blockquoteElement: Element) => { val container = document.createElement("div") @@ -65,7 +65,7 @@ object BlockquoteCleaner extends HtmlCleaner { object PullquoteCleaner extends HtmlCleaner { override def clean(document: Document): Document = { - val pullquotes = document.getElementsByTag("aside").filter(_.hasClass("element-pullquote")) + val pullquotes = document.getElementsByTag("aside").asScala.filter(_.hasClass("element-pullquote")) val openingQuoteSvg = views.html.fragments.inlineSvg("quote", "icon", List("inline-tone-fill")).toString() val closingQuoteSvg = views.html.fragments.inlineSvg("quote", "icon", List("closing", "inline-tone-fill")).toString() @@ -84,7 +84,7 @@ case object R2VideoCleaner extends HtmlCleaner { override def clean(document: Document): Document = { - val legacyVideos = document.getElementsByTag("video").filter(_.hasClass("gu-video")).filter(_.parent().tagName() != "figure") + val legacyVideos = document.getElementsByTag("video").asScala.filter(_.hasClass("gu-video")).filter(_.parent().tagName() != "figure") legacyVideos.foreach( videoElement => { videoElement.wrap("
") @@ -98,9 +98,9 @@ case object R2VideoCleaner extends HtmlCleaner { case class RecipeBodyImage(isRecipeArticle: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isRecipeArticle) { - document.getElementsByClass("element-image") foreach(_.remove()) - document.getElementsByTag("aside").filter(_.hasClass("element-pullquote")) foreach( _.remove()) - document.getElementsByClass("element-rich-link").foreach( _.remove()) + document.getElementsByClass("element-image").asScala foreach(_.remove()) + document.getElementsByTag("aside").asScala.filter(_.hasClass("element-pullquote")) foreach( _.remove()) + document.getElementsByClass("element-rich-link").asScala.foreach( _.remove()) } document } @@ -110,8 +110,8 @@ case class PictureCleaner(article: Article, amp: Boolean)(implicit request: Requ def clean(body: Document): Document = { for { - figure <- body.getElementsByTag("figure") - image <- figure.getElementsByTag("img").headOption + figure <- body.getElementsByTag("figure").asScala + image <- figure.getElementsByTag("img").asScala.headOption if !(figure.hasClass("element-comment") || figure.hasClass("element-witness") || figure.hasClass("element-atom")) @@ -188,12 +188,12 @@ case class PictureCleaner(article: Article, amp: Boolean)(implicit request: Requ def findBreakpointWidths(figure: Element): ContentHinting = { - figure.classNames().map(Some(_)) match { - case classes if classes.contains(Supporting.className) => Supporting - case classes if classes.contains(Showcase.className) => Showcase - case classes if classes.contains(Thumbnail.className) => Thumbnail - case classes if classes.contains(Immersive.className) => Immersive - case classes if classes.contains(Halfwidth.className) => Halfwidth + figure.classNames().asScala.map(Some(_)) match { + case classes if classes.asJava.contains(Supporting.className) => Supporting + case classes if classes.asJava.contains(Showcase.className) => Showcase + case classes if classes.asJava.contains(Thumbnail.className) => Thumbnail + case classes if classes.asJava.contains(Immersive.className) => Immersive + case classes if classes.asJava.contains(Halfwidth.className) => Halfwidth case _ => Inline } } @@ -223,7 +223,7 @@ case class InBodyLinkCleaner(dataLinkName: String, amp: Boolean = false)(implici def clean(body: Document): Document = { val links = body.getElementsByAttribute("href") - links.foreach { link => + links.asScala.foreach { link => if (link.tagName == "a") { link.attr("href", LinkTo(link.attr("href"), edition)) link.attr("data-link-name", dataLinkName) @@ -242,7 +242,7 @@ case class InBodyLinkCleaner(dataLinkName: String, amp: Boolean = false)(implici // bar -> bar val anchors = body.getElementsByAttribute("name") - anchors.foreach { anchor => + anchors.asScala.foreach { anchor => if (anchor.tagName == "a") { val text = anchor.ownText() anchor.empty().after(text) @@ -265,7 +265,7 @@ case class TruncateCleaner(limit: Int)(implicit val edition: Edition, implicit v } def truncateElement(charLimit: Int, element: Element): Int = { - element.childNodes.foldLeft(charLimit) { + element.childNodes.asScala.foldLeft(charLimit) { (t, node) => node match { case tNode: TextNode => truncateTextNode(t, tNode) @@ -284,7 +284,7 @@ class TweetCleaner(content: Content, amp: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { - document.getElementsByClass("element-tweet").foreach { tweet => + document.getElementsByClass("element-tweet").asScala.foreach { tweet => val tweetData: Option[Tweet] = Option(tweet.attr("data-canonical-url")).flatMap { url => url.split('/').lastOption.flatMap { id => @@ -294,7 +294,7 @@ class TweetCleaner(content: Content, amp: Boolean) extends HtmlCleaner { val tweetImage = tweetData.flatMap(_.firstImage) - tweet.getElementsByClass("twitter-tweet").foreach { element => + tweet.getElementsByClass("twitter-tweet").asScala.foreach { element => if (amp) { tweetData.foreach { elem => @@ -367,8 +367,8 @@ case class TagLinker(article: Article)(implicit val edition: Edition, implicit v if (article.content.showInRelated) { // Get all paragraphs which are not contained in a pullquote or in an instagram caption - val paragraphs = doc.getElementsByTag("p").filterNot( p => - p.parents.exists { ancestor => + val paragraphs = doc.getElementsByTag("p").asScala.filterNot( p => + p.parents.asScala.exists { ancestor => val inPullquote = ancestor.tagName() == "aside" && ancestor.hasClass("element-pullquote") val inInstagramBlock = ancestor.hasClass("instagram-media") inPullquote || inInstagramBlock @@ -421,7 +421,7 @@ object InBodyElementCleaner extends HtmlCleaner { override def clean(document: Document): Document = { // this code REMOVES unsupported embeds if(ShowAllArticleEmbedsSwitch.isSwitchedOff) { - val embeddedElements = document.getElementsByTag("figure").filter(_.hasClass("element")) + val embeddedElements = document.getElementsByTag("figure").asScala.filter(_.hasClass("element")) val unsupportedElements = embeddedElements.filterNot(e => supportedElements.exists(e.hasClass)) unsupportedElements.foreach(_.remove()) } @@ -431,7 +431,7 @@ object InBodyElementCleaner extends HtmlCleaner { case class Summary(amount: Int) extends HtmlCleaner { override def clean(document: Document): Document = { - val children = document.body().children().toList + val children = document.body().children().asScala.toList val para: Option[Element] = children.filter(_.nodeName() == "p").take(amount).lastOption // if there is are no p's, just take the first n things (could be a blog) para match { @@ -445,10 +445,10 @@ case class Summary(amount: Int) extends HtmlCleaner { case class PhotoEssayImages(isPhotoEssay: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isPhotoEssay) { - document.getElementsByTag("figure").filter(_.hasClass("element-image"))foreach{ images => + document.getElementsByTag("figure").asScala.filter(_.hasClass("element-image"))foreach{ images => images.addClass("element-image--photo-essay") } - document.getElementsByClass("block-share--article").foreach{ shares => + document.getElementsByClass("block-share--article").asScala.foreach{ shares => shares.remove() } } @@ -459,7 +459,7 @@ case class PhotoEssayImages(isPhotoEssay: Boolean) extends HtmlCleaner { case class PhotoEssayQuotes(isPhotoEssay: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isPhotoEssay) { - document.getElementsByClass("element-pullquote").foreach{ quotes => + document.getElementsByClass("element-pullquote").asScala.foreach{ quotes => quotes.addClass("element-pullquote--photo-essay") } } @@ -470,7 +470,7 @@ case class PhotoEssayQuotes(isPhotoEssay: Boolean) extends HtmlCleaner { case class PhotoEssayCaptions(isPhotoEssay: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isPhotoEssay) { - document.getElementsByClass("caption--img").foreach{ captions => + document.getElementsByClass("caption--img").asScala.foreach{ captions => captions.remove() } } @@ -481,7 +481,7 @@ case class PhotoEssayCaptions(isPhotoEssay: Boolean) extends HtmlCleaner { case class PhotoEssayHalfWidth(isPhotoEssay: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isPhotoEssay) { - document.getElementsByTag("figure").filter(_.hasClass("element--halfWidth")).zipWithIndex.foreach{ case(halfWidthImage, index) => + document.getElementsByTag("figure").asScala.filter(_.hasClass("element--halfWidth")).zipWithIndex.foreach{ case(halfWidthImage, index) => if(index % 2 == 0) { halfWidthImage.addClass("half-width-odd") } @@ -494,7 +494,7 @@ case class PhotoEssayHalfWidth(isPhotoEssay: Boolean) extends HtmlCleaner { case class PhotoEssayBlockQuote(isPhotoEssay: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isPhotoEssay) { - document.getElementsByTag("blockquote").foreach{ blockquotes => + document.getElementsByTag("blockquote").asScala.foreach{ blockquotes => if(!blockquotes.children().is(".pullquote-paragraph")){ blockquotes.addClass("photo-essay-block-quote") } @@ -507,7 +507,7 @@ case class PhotoEssayBlockQuote(isPhotoEssay: Boolean) extends HtmlCleaner { case class ImmersiveLinks(isImmersive: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isImmersive) { - document.getElementsByTag("a").foreach{ a => + document.getElementsByTag("a").asScala.foreach{ a => a.addClass("in-body-link--immersive") } } @@ -518,7 +518,7 @@ case class ImmersiveLinks(isImmersive: Boolean) extends HtmlCleaner { case class ImmersiveHeaders(isImmersive: Boolean) extends HtmlCleaner { override def clean(document: Document): Document = { if(isImmersive) { - document.getElementsByTag("h2").foreach{ h2 => + document.getElementsByTag("h2").asScala.foreach{ h2 => val beforeH2 = h2.previousElementSibling() if (beforeH2 != null) { if(beforeH2.hasClass("element--immersive") && beforeH2.hasClass("element-image")) { @@ -543,7 +543,7 @@ case class DropCaps(isFeature: Boolean, isImmersive: Boolean, isRecipeArticle: B override def clean(document: Document): Document = { if(isFeature && !isRecipeArticle) { - val children = document.body().children().toList + val children = document.body().children().asScala.toList children.headOption match { case Some(p) => if (p.nodeName() == "p") p.html(setDropCap(p)) @@ -551,7 +551,7 @@ case class DropCaps(isFeature: Boolean, isImmersive: Boolean, isRecipeArticle: B } } - document.getElementsByTag("h2").foreach{ h2 => + document.getElementsByTag("h2").asScala.foreach{ h2 => if (isImmersive && h2.text() == "* * *") { h2.before("""
""") @@ -616,14 +616,14 @@ object InteractiveSrcdocCleaner extends HtmlCleaner { object FigCaptionCleaner extends HtmlCleaner { override def clean(document: Document): Document = { - document.getElementsByTag("figcaption").foreach{ _.addClass("caption caption--img")} + document.getElementsByTag("figcaption").asScala.foreach{ _.addClass("caption caption--img")} document } } object MainFigCaptionCleaner extends HtmlCleaner { override def clean(document: Document): Document = { - document.getElementsByTag("figcaption").foreach{ _.addClass("caption caption--img caption--main")} + document.getElementsByTag("figcaption").asScala.foreach{ _.addClass("caption caption--img caption--main")} document } } @@ -635,11 +635,11 @@ case class RichLinkCleaner(amp: Boolean = false) extends HtmlCleaner { richLinks .addClass("element-rich-link--not-upgraded") - .attr("data-component", "rich-link") - .zipWithIndex.map{ case (el, index) => el.attr("data-link-name", s"rich-link-${richLinks.length} | ${index+1}") } + .attr("data-component", "rich-link").asScala + .zipWithIndex.map{ case (el, index) => el.attr("data-link-name", s"rich-link-${richLinks.asScala.length} | ${index+1}") } if (!amp) { - richLinks + richLinks.asScala .map( richLink => { val link = richLink.getElementsByTag("a").first() val href = link.attr("href") @@ -657,8 +657,8 @@ object MembershipEventCleaner extends HtmlCleaner { val membershipEvents = document.getElementsByClass("element-membership") membershipEvents .addClass("element-membership--not-upgraded") - .attr("data-component", "membership-events") - .zipWithIndex.map{ case (el, index) => el.attr("data-link-name", s"membership-event-${membershipEvents.length} | ${index+1}") } + .attr("data-component", "membership-events").asScala + .zipWithIndex.map{ case (el, index) => el.attr("data-link-name", s"membership-event-${membershipEvents.asScala.length} | ${index+1}") } document } @@ -672,8 +672,8 @@ case class AtomsCleaner(atoms: Option[Atoms], shouldFence: Boolean = true, amp: override def clean(document: Document): Document = { if (UseAtomsSwitch.isSwitchedOn) { for { - atomContainer <- document.getElementsByClass("element-atom") - bodyElement <- atomContainer.getElementsByTag("gu-atom") + atomContainer <- document.getElementsByClass("element-atom").asScala + bodyElement <- atomContainer.getElementsByTag("gu-atom").asScala atomId <- Some(bodyElement.attr("data-atom-id")) atomData <- findAtom(atomId) } { @@ -718,7 +718,7 @@ case class CommercialMPUForFronts(isNetworkFront: Boolean) extends HtmlCleaner { val sliceSlot = views.html.fragments.items.facia_cards.sliceSlot - val containers: List[Element] = document.getElementsByClass("fc-container").toList + val containers: List[Element] = document.getElementsByClass("fc-container").asScala.toList // On mobile, we remove the first container if it is a thrasher on a Network Front // and remove a container if it, or the next sibling, is a commercial container @@ -734,7 +734,7 @@ case class CommercialMPUForFronts(isNetworkFront: Boolean) extends HtmlCleaner { } // On desktop, a MPU slot is simply inserted when there is a slice available - val slices: List[Element] = document.getElementsByClass("fc-slice__item--mpu-candidate").toList + val slices: List[Element] = document.getElementsByClass("fc-slice__item--mpu-candidate").asScala.toList for (slice <- slices) { slice.append(s"${sliceSlot(slices.indexOf(slice) + 1)}") @@ -748,7 +748,7 @@ case class CommercialComponentHigh(isPaidContent: Boolean, isNetworkFront: Boole override def clean(document: Document): Document = { - val containers: List[(Element, Int)] = document.getElementsByClass("fc-container").toList.zipWithIndex + val containers: List[(Element, Int)] = document.getElementsByClass("fc-container").asScala.toList.zipWithIndex val minContainers = if (isPaidContent) 1 else 2 @@ -760,7 +760,7 @@ case class CommercialComponentHigh(isPaidContent: Boolean, isNetworkFront: Boole val adSlotHtml = views.html.fragments.commercial.commercialComponentHigh(isPaidContent, hasPageSkin) - val adSlot: Option[Element] = Jsoup.parseBodyFragment(adSlotHtml.toString).body().children().toList.headOption + val adSlot: Option[Element] = Jsoup.parseBodyFragment(adSlotHtml.toString).body().children().asScala.toList.headOption for { (container, _) <- containers.lift(containerIndex) @@ -782,7 +782,7 @@ case class ExplainerCleaner(explainers: Seq[ExplainerAtom]) extends HtmlCleaner override def clean(document: Document): Document = { document - .getElementsByClass("element-interactive") + .getElementsByClass("element-interactive").asScala .foreach { i => val eid = i.attr("data-canonical-url").drop(prefixLength) val eidInTest = eids.find(_.id == eid) diff --git a/common/app/views/support/MinuteCleaner.scala b/common/app/views/support/MinuteCleaner.scala index eaec15cc4a51..095dee8bee8d 100644 --- a/common/app/views/support/MinuteCleaner.scala +++ b/common/app/views/support/MinuteCleaner.scala @@ -1,12 +1,12 @@ package views.support import org.jsoup.nodes.{Document, Element} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ case class TimestampCleaner(article: model.Article) extends HtmlCleaner { override def clean(document: Document): Document = { // US Minute articles use liveblog blocks but we don't want to show timestamps - if (article.isTheMinute) document.getElementsByClass("published-time").foreach(_.remove) + if (article.isTheMinute) document.getElementsByClass("published-time").asScala.foreach(_.remove) document } } @@ -36,7 +36,7 @@ case class MinuteCleaner(article: model.Article) extends HtmlCleaner { override def clean(document: Document): Document = { if (article.isTheMinute) { - document.getElementsByClass("block").foreach { block => + document.getElementsByClass("block").asScala.foreach { block => val allElements = block.getAllElements val heading = block.select("h2.block-title") val headingNumRegEx = "^([0-9]+)[.]{1}[ ]*" @@ -61,7 +61,7 @@ case class MinuteCleaner(article: model.Article) extends HtmlCleaner { // Add relevant classes ParentClasses.foldLeft(Set(): Set[String]) { case (classes, (childClass, parentClass)) => - if (allElements.exists(_.hasClass(childClass))) classes + parentClass + if (allElements.asScala.exists(_.hasClass(childClass))) classes + parentClass else classes } foreach block.addClass @@ -71,23 +71,23 @@ case class MinuteCleaner(article: model.Article) extends HtmlCleaner { } // Remove Un-needed Classes - allElements.foreach(el => strippable.foreach(el.removeClass)) + allElements.asScala.foreach(el => strippable.foreach(el.removeClass)) // Re-order Elements - block.getElementsByClass("block-elements").headOption.map { outer => - block.getElementsByClass("block-title").headOption.map(t => outer.insertChildren(0, Seq(t))) - outer.getElementsByClass("element-image").headOption.map(outer.after) + block.getElementsByClass("block-elements").asScala.headOption.map { outer => + block.getElementsByClass("block-title").asScala.headOption.map(t => outer.insertChildren(0, t)) + outer.getElementsByClass("element-image").asScala.headOption.map(outer.after) } // Inline (fullscreen) image mark-up // Move the picture element out of thumbnail anchor and responsive image - block.getElementsByClass("element--inline").headOption.map { figure => - figure.getElementsByClass("u-responsive-ratio").headOption.map { outer => { - figure.insertChildren(0, Seq(outer)) - outer.getElementsByClass("gu-image").headOption.map(image => image.addClass("js-is-fixed-height")) + block.getElementsByClass("element--inline").asScala.headOption.map { figure => + figure.getElementsByClass("u-responsive-ratio").asScala.headOption.map { outer => { + figure.insertChildren(0, outer) + outer.getElementsByClass("gu-image").asScala.headOption.map(image => image.addClass("js-is-fixed-height")) outer.addClass("element--inline__image-wrapper") }} - figure.getElementsByClass("article__img-container").headOption.map(container => container.remove()) + figure.getElementsByClass("article__img-container").asScala.headOption.map(container => container.remove()) } // Remove Elements diff --git a/common/app/views/support/WitnessCleaner.scala b/common/app/views/support/WitnessCleaner.scala index 90495ae314ad..dd150bb3d18d 100644 --- a/common/app/views/support/WitnessCleaner.scala +++ b/common/app/views/support/WitnessCleaner.scala @@ -1,23 +1,23 @@ package views.support import org.jsoup.nodes.{ Element, Document } -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ object WitnessCleaner extends HtmlCleaner { override def clean(document: Document): Document = { - document.getElementsByClass("element-witness-video").foreach { embed: Element => + document.getElementsByClass("element-witness-video").asScala.foreach { embed: Element => //remove height from video iframe - embed.getElementsByClass("element-witness--main").foreach { main => - main.getElementsByTag("iframe").foreach(_.attr("height", "")) + embed.getElementsByClass("element-witness--main").asScala.foreach { main => + main.getElementsByTag("iframe").asScala.foreach(_.attr("height", "")) } } - document.getElementsByClass("element-witness--brand").foreach { brand: Element => + document.getElementsByClass("element-witness--brand").asScala.foreach { brand: Element => val witnessLogo = document.createElement("span") witnessLogo.attr("class", "witness-logo") witnessLogo.html("Guardian Witness") - brand.children().foreach(_.remove) + brand.children().asScala.foreach(_.remove) brand.text("") brand.appendChild(witnessLogo) } diff --git a/common/app/views/support/cleaner/AmpAdCleaner.scala b/common/app/views/support/cleaner/AmpAdCleaner.scala index 81e06c615a81..698eda539b0d 100644 --- a/common/app/views/support/cleaner/AmpAdCleaner.scala +++ b/common/app/views/support/cleaner/AmpAdCleaner.scala @@ -5,7 +5,7 @@ import model.Article import org.jsoup.nodes.{Document, Element} import views.support.{AmpAd, AmpAdDataSlot, HtmlCleaner} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ object AmpAdCleaner { val AD_LIMIT = 8 @@ -97,7 +97,7 @@ case class AmpAdCleaner(edition: Edition, uri: String, article: Article) extends } override def clean(document: Document): Document = { - val children = document.body().children().toList + val children = document.body().children().asScala.toList val adsAfterAndEnd = AmpAdCleaner.findElementsNeedingAdsAfter(children) adsAfterAndEnd.foreach(adAfter) // side effects =( document diff --git a/common/app/views/support/cleaner/AmpEmbedCleaner.scala b/common/app/views/support/cleaner/AmpEmbedCleaner.scala index 5a6bc9f34c4c..c263b2e558c4 100644 --- a/common/app/views/support/cleaner/AmpEmbedCleaner.scala +++ b/common/app/views/support/cleaner/AmpEmbedCleaner.scala @@ -6,14 +6,14 @@ import model.{Article, VideoAsset} import org.jsoup.nodes.{Document, Element} import views.support.{AmpSrcCleaner, HtmlCleaner} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.collection.mutable case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def cleanAmpVideos(document: Document): Unit = { - document.getElementsByTag("video").foreach(video => { + document.getElementsByTag("video").asScala.foreach(video => { val posterSrc = video.attr("poster") val newPosterSrc = AmpSrcCleaner(posterSrc).toString val mediaId = video.attr("data-media-id") @@ -83,8 +83,8 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def clean(document: Document): mutable.Buffer[Unit] = { for { - videoElement <- document.getElementsByClass("element-video") - iframeElement <- videoElement.getElementsByTag("iframe") + videoElement <- document.getElementsByClass("element-video").asScala + iframeElement <- videoElement.getElementsByTag("iframe").asScala ampExternalVideo <- getAmpExternalVideoByUrl(videoElement.attr("data-canonical-url")) } yield { val ampVideoElement = createElement(document, ampExternalVideo.elementType, ampExternalVideo.attributes) @@ -139,8 +139,8 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def clean(document: Document): mutable.Buffer[Unit] = { for { - audioElement <- document.getElementsByClass("element-audio") - iframeElement <- audioElement.getElementsByTag("iframe") + audioElement <- document.getElementsByClass("element-audio").asScala + iframeElement <- audioElement.getElementsByTag("iframe").asScala } yield { val soundcloudElement = AmpSoundcloud.getSoundCloudElement(document, iframeElement) if (soundcloudElement.nonEmpty) { @@ -164,8 +164,8 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def cleanAmpInstagram(document: Document): Unit = { - document.getElementsByClass("element-instagram").foreach { embed: Element => - embed.getElementsByTag("a").map { element: Element => + document.getElementsByClass("element-instagram").asScala.foreach { embed: Element => + embed.getElementsByTag("a").asScala.map { element: Element => val src = element.attr("href") val list = src.split("""instagram\.com/p/""") (if (list.length == 1) None else list.lastOption).flatMap(_.split("/").headOption).map { shortcode => @@ -188,11 +188,11 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def canRenderInteractive(element: Element): Boolean = { element.attributes().get("data-interactive").contains("iframe-wrapper") && - element.getElementsByTag("a").nonEmpty + element.getElementsByTag("a").asScala.nonEmpty } def cleanAmpInteractives(document: Document): Unit = { - document.getElementsByClass("element-interactive").foreach { + document.getElementsByClass("element-interactive").asScala.foreach { interactive: Element => if (canRenderInteractive(interactive)) { val link = interactive.getElementsByTag("a") @@ -236,8 +236,8 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def cleanAmpMaps(document: Document): Unit = { - document.getElementsByClass("element-map").foreach { embed: Element => - embed.getElementsByTag("iframe").foreach { element: Element => + document.getElementsByClass("element-map").asScala.foreach { embed: Element => + embed.getElementsByTag("iframe").asScala.foreach { element: Element => val src = element.attr("src") val frameBorder = element.attr("frameborder") val elementMap = document.createElement("amp-iframe") @@ -267,8 +267,8 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def cleanAmpComments(document: Document): Unit = { - document.getElementsByClass("element-comment").foreach { figure: Element => - figure.getElementsByTag("img").foreach { image: Element => + document.getElementsByClass("element-comment").asScala.foreach { figure: Element => + figure.getElementsByTag("img").asScala.foreach { image: Element => val validImage = image.hasAttr("class") && image.attr("class").contains("d2-avatar") && image.hasAttr("src") && image.hasAttr("height") && image.hasAttr("width") && image.hasAttr("alt") if (validImage) { val ampImg = document.createElement("amp-img") @@ -292,9 +292,9 @@ case class AmpEmbedCleaner(article: Article) extends HtmlCleaner { def cleanAmpEmbed(document: Document): Unit = { - document.getElementsByClass("element-embed") - .filter(_.getElementsByTag("iframe").nonEmpty) - .foreach(_.getElementsByTag("iframe").foreach { + document.getElementsByClass("element-embed").asScala + .filter(_.getElementsByTag("iframe").asScala.nonEmpty) + .foreach(_.getElementsByTag("iframe").asScala.foreach { //check for soundcloud embeds and remove any others iframeElement: Element => val soundcloudElement = AmpSoundcloud.getSoundCloudElement(document, iframeElement) diff --git a/common/app/views/support/cleaner/CmpParamCleaner.scala b/common/app/views/support/cleaner/CmpParamCleaner.scala index 97b28e4db9ed..2d13d198e71e 100644 --- a/common/app/views/support/cleaner/CmpParamCleaner.scala +++ b/common/app/views/support/cleaner/CmpParamCleaner.scala @@ -3,7 +3,7 @@ package views.support.cleaner import org.jsoup.nodes.{Document, Element} import views.support.HtmlCleaner -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ object CmpParamCleaner extends HtmlCleaner { override def clean(document: Document): Document = { @@ -11,7 +11,7 @@ object CmpParamCleaner extends HtmlCleaner { "profile.theguardian.com/form/embed") // Guardian embed wrapper for (url <- formstackSrcValues) { - document.getElementsByAttributeValueContaining("src", url).foreach { elem: Element => + document.getElementsByAttributeValueContaining("src", url).asScala.foreach { elem: Element => elem.addClass("element-pass-cmp") } } diff --git a/common/app/views/support/cleaner/VideoEmbedCleaner.scala b/common/app/views/support/cleaner/VideoEmbedCleaner.scala index 6219ead17024..411e467e3e72 100644 --- a/common/app/views/support/cleaner/VideoEmbedCleaner.scala +++ b/common/app/views/support/cleaner/VideoEmbedCleaner.scala @@ -6,7 +6,7 @@ import model.{Article, DotcomContentType, ShareLinks, VideoElement} import org.jsoup.nodes.{Document, Element} import views.support.{HtmlCleaner, Item640} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ /* * maxEmbedHeight: 812px - full height on an iPhone X @@ -16,7 +16,7 @@ case class VideoEmbedCleaner(article: Article, maxEmbedHeight: Int = 812) extend def facebookVideoEmbedUrlFor(url: String): String = s"$facebookVideoEmbedUrl${URLEncoder.encode(url, "UTF-8")}" def addShareButtons(document: Document): Unit = { - document.getElementsByClass("element-video").foreach(element => { + document.getElementsByClass("element-video").asScala.foreach(element => { val webUrl = element.attr("data-canonical-url") val blockId = element.attr("data-media-id") val mediaPath = element.attr("data-video-poster") @@ -32,7 +32,7 @@ case class VideoEmbedCleaner(article: Article, maxEmbedHeight: Int = 812) extend element.addClass("fig--has-shares") element.addClass("fig--narrow-caption") // add extra margin if there is no caption to fit the share buttons - val figcaption = element.getElementsByTag("figcaption") + val figcaption = element.getElementsByTag("figcaption").asScala if (figcaption.length < 1) { element.addClass("fig--no-caption") } @@ -45,12 +45,12 @@ case class VideoEmbedCleaner(article: Article, maxEmbedHeight: Int = 812) extend addShareButtons(document) } - document.getElementsByClass("element-video").foreach { figure: Element => + document.getElementsByClass("element-video").asScala.foreach { figure: Element => val canonicalUrl = figure.attr("data-canonical-url") val figcaption = figure.getElementsByTag("figcaption") figure.attr("data-component", "video-inbody-embed") - figure.getElementsByClass("gu-video").foreach { element: Element => + figure.getElementsByClass("gu-video").asScala.foreach { element: Element => element .removeClass("gu-video") .addClass("js-gu-media--enhance gu-media gu-media--video") @@ -61,7 +61,7 @@ case class VideoEmbedCleaner(article: Article, maxEmbedHeight: Int = 812) extend element.attr("data-canonical-url", new URL(canonicalUrl).getPath.stripPrefix("/")) } - if (figcaption.nonEmpty) { + if (figcaption.asScala.nonEmpty) { val informationIcon = views.html.fragments.inlineSvg("information", "icon", List("centered-icon", "rounded-icon")).toString() figcaption.prepend(informationIcon) } @@ -97,11 +97,11 @@ case class VideoEmbedCleaner(article: Article, maxEmbedHeight: Int = 812) extend } override def clean(document: Document): Document = { - document.getElementsByClass("element-video").filter { element: Element => + document.getElementsByClass("element-video").asScala.filter { element: Element => element.getElementsByClass("gu-video").isEmpty }.foreach { element: Element => val canonicalUrl = element.attr("data-canonical-url") - element.children().headOption.foreach { child => + element.children().asScala.headOption.foreach { child => // As Facebook have declared that you have to use their video JS plugin, which in turn pulls in their whole JS API // We've decided to use the canonical URL, and create the video element here rather that CAPI, as, if it changes // again, we can change it here and it will also fix things retrospectively. @@ -121,7 +121,7 @@ case class VideoEmbedCleaner(article: Article, maxEmbedHeight: Int = 812) extend cleanVideo(document) - document.getElementsByClass("element-witness--main").foreach { element: Element => + document.getElementsByClass("element-witness--main").asScala.foreach { element: Element => element.select("iframe").wrap("
") } diff --git a/common/app/views/support/package.scala b/common/app/views/support/package.scala index 6eeb163129d3..156e7586ff6b 100644 --- a/common/app/views/support/package.scala +++ b/common/app/views/support/package.scala @@ -18,7 +18,7 @@ import play.api.mvc.{RequestHeader, Result} import play.twirl.api.Html import layout.slices.ContainerDefinition -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ /** * Encapsulates previous and next urls @@ -84,7 +84,9 @@ object ContributorLinks { object `package` { - def withJsoup(html: Html)(cleaners: HtmlCleaner*): Html = withJsoup(html.body) { cleaners: _* } + def withJsoup(html: Html)(cleaners: HtmlCleaner*): Html = withJsoup(html.body) { + cleaners: _* + } def withJsoup(html: String)(cleaners: HtmlCleaner*): Html = { val cleanedHtml = cleaners.foldLeft(Jsoup.parseBodyFragment(html)) { case (html, cleaner) => cleaner.clean(html) } @@ -163,7 +165,7 @@ object StripHtmlTagsAndUnescapeEntities{ object TableEmbedComplimentaryToP extends HtmlCleaner { override def clean(document: Document): Document = { - document.getElementsByClass("element-table").foreach { element => + document.getElementsByClass("element-table").asScala.foreach { element => Option(element.nextElementSibling).map { nextSibling => if (nextSibling.tagName == "p") element.addClass("element-table--complimentary") } diff --git a/common/test/common/TagLinkerTest.scala b/common/test/common/TagLinkerTest.scala index 038138dfe5ee..a23b25a23b66 100644 --- a/common/test/common/TagLinkerTest.scala +++ b/common/test/common/TagLinkerTest.scala @@ -15,7 +15,7 @@ import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.test.FakeRequest import views.support.TagLinker -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ class TagLinkerTest extends FlatSpec with Matchers with GuiceOneAppPerSuite { @@ -23,7 +23,7 @@ class TagLinkerTest extends FlatSpec with Matchers with GuiceOneAppPerSuite { implicit val request = FakeRequest("GET", "/") private implicit class Document2FirstPara(d: Document) { - val firstPara = d.select("p").head.html + val firstPara = d.select("p").asScala.head.html } "TagLinker" should "link tag at the start of the paragraph" in { diff --git a/common/test/conf/switches/SwitchesTest.scala b/common/test/conf/switches/SwitchesTest.scala index c63495dc0d52..d85f75a10ea8 100644 --- a/common/test/conf/switches/SwitchesTest.scala +++ b/common/test/conf/switches/SwitchesTest.scala @@ -9,7 +9,7 @@ class SwitchesTest extends FlatSpec with Matchers with AppendedClues { private val SwitchNamePattern = """([a-z\d-]+)""".r private def forAllSwitches(test: Switch => Unit): Unit = { - whenReady(Switches.eventuallyAll)(_ foreach { switch => test(switch) withClue s"(switch: '${switch.name}')" }) + Switches.all foreach { switch => test(switch) withClue s"(switch: '${switch.name}')" } } private val testSwitchGroup = new SwitchGroup("category") diff --git a/common/test/metrics/DurationMetricTest.scala b/common/test/metrics/DurationMetricTest.scala index fc06e1e3862f..62f9183c794c 100644 --- a/common/test/metrics/DurationMetricTest.scala +++ b/common/test/metrics/DurationMetricTest.scala @@ -2,9 +2,6 @@ package metrics import com.amazonaws.services.cloudwatch.model.StandardUnit import org.scalatest.{FlatSpec, Matchers} -import scala.concurrent.Await -import scala.concurrent.duration._ - class DurationMetricTest extends FlatSpec with Matchers{ @@ -21,15 +18,11 @@ class DurationMetricTest extends FlatSpec with Matchers{ durationMetric.recordDuration(1000) durationMetric.recordDuration(1000) - Await.result(durationMetric.getDataFuture, 10.seconds) - val storedDatapoints = durationMetric.getAndResetDataPoints storedDatapoints.length should be (3) storedDatapoints.forall(_.value == 1000) should be (true) - Await.result(durationMetric.getDataFuture, 10.seconds) - durationMetric.getAndResetDataPoints.length should be(0) } @@ -47,8 +40,6 @@ class DurationMetricTest extends FlatSpec with Matchers{ durationMetric.recordDuration(1000) List(metricOne, metricTwo, metricThree, metricFour).map(durationMetric.record) - Await.result(durationMetric.getDataFuture, 10.seconds) - val dataPoints = durationMetric.getAndResetDataPoints dataPoints.length should be (7) dataPoints.splitAt(4)._1 should be (allMetrics) diff --git a/common/test/model/CachedTest.scala b/common/test/model/CachedTest.scala index 97d6418bf071..f0da81601922 100644 --- a/common/test/model/CachedTest.scala +++ b/common/test/model/CachedTest.scala @@ -8,7 +8,7 @@ import conf.switches.Switches.LongCacheSwitch import implicits.Dates.jodaToJavaInstant import model.Cached.{RevalidatableResult, WithoutRevalidationResult} import org.joda.time.DateTime -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ import org.scalatest.{FlatSpec, Matchers} import play.api.mvc.Results diff --git a/common/test/model/DateTimeTest.scala b/common/test/model/DateTimeTest.scala index fd849d886ea4..94e3469ef3bc 100644 --- a/common/test/model/DateTimeTest.scala +++ b/common/test/model/DateTimeTest.scala @@ -5,7 +5,7 @@ import org.scalatest.FlatSpec import org.scalatest.Matchers import org.joda.time.DateTime import com.gu.contentapi.client.model.v1.{ Content => ApiContent } -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ class DateTimeTest extends FlatSpec with Matchers with implicits.Dates { diff --git a/common/test/views/support/TemplatesTest.scala b/common/test/views/support/TemplatesTest.scala index d47d6d2dfe51..9043c155a286 100644 --- a/common/test/views/support/TemplatesTest.scala +++ b/common/test/views/support/TemplatesTest.scala @@ -12,7 +12,7 @@ import play.api.test.FakeRequest import test.TestRequest import org.scalatestplus.play.guice.GuiceOneAppPerSuite -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ import scala.xml.XML class TemplatesTest extends FlatSpec with Matchers with GuiceOneAppPerSuite { @@ -67,13 +67,13 @@ class TemplatesTest extends FlatSpec with Matchers with GuiceOneAppPerSuite { portraitImg.attr("data-media-id") should be ("gu-image-5") portraitImg.nextElementSibling.hasClass("following-element") should be (true) - for {fig <- figures} { + for {fig <- figures.asScala} { fig.attr("itemprop") should be ("associatedMedia image") fig.attr("itemscope") should be ("") fig.attr("itemtype") should be ("http://schema.org/ImageObject") } - for { caption <- body.getElementsByTag("figcaption") } { + for { caption <- body.getElementsByTag("figcaption").asScala } { caption.attr("itemprop") should be("description") caption.text should include("test caption") } diff --git a/common/test/views/support/cleaner/AmpAdCleanerTest.scala b/common/test/views/support/cleaner/AmpAdCleanerTest.scala index f26378b3a60a..da3522837e62 100644 --- a/common/test/views/support/cleaner/AmpAdCleanerTest.scala +++ b/common/test/views/support/cleaner/AmpAdCleanerTest.scala @@ -4,7 +4,7 @@ import org.jsoup.nodes.Element import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.scalatest.{FlatSpec, Matchers} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ class AmpAdCleanerTest extends FlatSpec with Matchers { @@ -15,7 +15,7 @@ class AmpAdCleanerTest extends FlatSpec with Matchers { } private def clean(document: Document): Document = { - val children = document.body().children().toList + val children = document.body().children().asScala.toList val adsAfterAndEnd = AmpAdCleaner.findElementsNeedingAdsAfter(children) adsAfterAndEnd.foreach(adAfter) // side effects =( document diff --git a/common/test/views/support/cleaner/VideoEmbedCleanerTest.scala b/common/test/views/support/cleaner/VideoEmbedCleanerTest.scala index 75bf046920e2..b35af815742e 100644 --- a/common/test/views/support/cleaner/VideoEmbedCleanerTest.scala +++ b/common/test/views/support/cleaner/VideoEmbedCleanerTest.scala @@ -6,7 +6,7 @@ import org.jsoup.nodes.Element import org.jsoup.Jsoup import org.jsoup.nodes.Document import org.scalatest.{FlatSpec, Matchers} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ class VideoEmbedCleanerTest extends FlatSpec with Matchers { diff --git a/data/database/08159e58c1aeca7e4c23388225d709862a99f0386bf27bdc9dce092b213b366e b/data/database/0170bcdcf523e17120fc6b27e1ca67edc824daf0d3571cd11637b7ce8f8ee6bc similarity index 91% rename from data/database/08159e58c1aeca7e4c23388225d709862a99f0386bf27bdc9dce092b213b366e rename to data/database/0170bcdcf523e17120fc6b27e1ca67edc824daf0d3571cd11637b7ce8f8ee6bc index f2962605642a..9c8ec14e2b3b 100644 Binary files a/data/database/08159e58c1aeca7e4c23388225d709862a99f0386bf27bdc9dce092b213b366e and b/data/database/0170bcdcf523e17120fc6b27e1ca67edc824daf0d3571cd11637b7ce8f8ee6bc differ diff --git a/data/database/041afd392fe6d23ced00426ffeb23353ee59c24046110266b7d673ee1a86e29a b/data/database/041afd392fe6d23ced00426ffeb23353ee59c24046110266b7d673ee1a86e29a deleted file mode 100644 index 138f55053f0a..000000000000 Binary files a/data/database/041afd392fe6d23ced00426ffeb23353ee59c24046110266b7d673ee1a86e29a and /dev/null differ diff --git a/data/database/0535efce400ce109464d224f74b1a661efa98f1a74db50ca7ee2516e2b081840 b/data/database/0535efce400ce109464d224f74b1a661efa98f1a74db50ca7ee2516e2b081840 deleted file mode 100644 index 473f4d626eea..000000000000 Binary files a/data/database/0535efce400ce109464d224f74b1a661efa98f1a74db50ca7ee2516e2b081840 and /dev/null differ diff --git a/data/database/6c84da95d68744278169dbce83c6a17f7e3d177578662bcc3577b3032723254f b/data/database/06d6fb2aad2b4abee2250d39a0870f46a35b5088603a64cd36a262960bab5f19 similarity index 100% rename from data/database/6c84da95d68744278169dbce83c6a17f7e3d177578662bcc3577b3032723254f rename to data/database/06d6fb2aad2b4abee2250d39a0870f46a35b5088603a64cd36a262960bab5f19 diff --git a/data/database/0774a33b694580432c13e89cd59e2191a6846a0e72a3b837c36362cf849327e2 b/data/database/0774a33b694580432c13e89cd59e2191a6846a0e72a3b837c36362cf849327e2 deleted file mode 100644 index 820a923bb24d..000000000000 Binary files a/data/database/0774a33b694580432c13e89cd59e2191a6846a0e72a3b837c36362cf849327e2 and /dev/null differ diff --git a/data/database/877f4baac8155b4ba95ecaea70ae2ed5c8bc1e28c462a34f4c6462bd4751b935 b/data/database/0916affcc11263f6732688314ad5c45a2a9dd49f11829359957893fc2e921a50 similarity index 100% rename from data/database/877f4baac8155b4ba95ecaea70ae2ed5c8bc1e28c462a34f4c6462bd4751b935 rename to data/database/0916affcc11263f6732688314ad5c45a2a9dd49f11829359957893fc2e921a50 diff --git a/data/database/0a1a525f84f245fb7f41c9d2cbadb7c91201ff14a1559dbcd19d9a05e33e8804 b/data/database/0a1a525f84f245fb7f41c9d2cbadb7c91201ff14a1559dbcd19d9a05e33e8804 deleted file mode 100644 index 5cd44b5994bd..000000000000 Binary files a/data/database/0a1a525f84f245fb7f41c9d2cbadb7c91201ff14a1559dbcd19d9a05e33e8804 and /dev/null differ diff --git a/data/database/bb7c32c508a96405c9e4c1f3eb979f826145adc178fa6c6d57b721a3499d2316 b/data/database/0a61eddad259b2a1a4d7ea7bc8047d2f634bdcf0b035a5bd1636fd0950377b85 similarity index 52% rename from data/database/bb7c32c508a96405c9e4c1f3eb979f826145adc178fa6c6d57b721a3499d2316 rename to data/database/0a61eddad259b2a1a4d7ea7bc8047d2f634bdcf0b035a5bd1636fd0950377b85 index 7d45d6bc58cf..21886f3af0c1 100644 Binary files a/data/database/bb7c32c508a96405c9e4c1f3eb979f826145adc178fa6c6d57b721a3499d2316 and b/data/database/0a61eddad259b2a1a4d7ea7bc8047d2f634bdcf0b035a5bd1636fd0950377b85 differ diff --git a/data/database/90f83f1aeeda79d0d8fbcfbb76892026daca62e2f8ce72164453f9085dd86e5e b/data/database/0b48adbff571b55760d36fec2c8e19d9059d826fecd5f35f10366b00019cecdb similarity index 100% rename from data/database/90f83f1aeeda79d0d8fbcfbb76892026daca62e2f8ce72164453f9085dd86e5e rename to data/database/0b48adbff571b55760d36fec2c8e19d9059d826fecd5f35f10366b00019cecdb diff --git a/data/database/0ea91967ebcb5cfcb46623535b664fe78514be4b9afd6faba52e751ca633c8c9 b/data/database/0ea91967ebcb5cfcb46623535b664fe78514be4b9afd6faba52e751ca633c8c9 deleted file mode 100644 index 58feb3512b17..000000000000 Binary files a/data/database/0ea91967ebcb5cfcb46623535b664fe78514be4b9afd6faba52e751ca633c8c9 and /dev/null differ diff --git a/data/database/24b959861198bfd51e4ce769235582c3fa50b48135e7aa7f2dc51b0344ba4486 b/data/database/0ee0cb7a30a46f4614963df6113b2a2599766b43ad409e143717eb93f5d78e3c similarity index 100% rename from data/database/24b959861198bfd51e4ce769235582c3fa50b48135e7aa7f2dc51b0344ba4486 rename to data/database/0ee0cb7a30a46f4614963df6113b2a2599766b43ad409e143717eb93f5d78e3c diff --git a/data/database/f56d002c45d6abcc7d194213fe7d2814f4431e0f2cf5bb4f44c5365718087536 b/data/database/10a9285945a354ed48aefcf201ac68d660fa10cdb69fc8c09cdb67578c303b19 similarity index 93% rename from data/database/f56d002c45d6abcc7d194213fe7d2814f4431e0f2cf5bb4f44c5365718087536 rename to data/database/10a9285945a354ed48aefcf201ac68d660fa10cdb69fc8c09cdb67578c303b19 index b111e704b3e6..6321376a4883 100644 Binary files a/data/database/f56d002c45d6abcc7d194213fe7d2814f4431e0f2cf5bb4f44c5365718087536 and b/data/database/10a9285945a354ed48aefcf201ac68d660fa10cdb69fc8c09cdb67578c303b19 differ diff --git a/data/database/10ddc8c26b89fa1e003806c4d343174ebfbaa76f92ca36fab7ccf5b35649c568 b/data/database/10ddc8c26b89fa1e003806c4d343174ebfbaa76f92ca36fab7ccf5b35649c568 deleted file mode 100644 index de07af2e8cbb..000000000000 Binary files a/data/database/10ddc8c26b89fa1e003806c4d343174ebfbaa76f92ca36fab7ccf5b35649c568 and /dev/null differ diff --git a/data/database/10e4bed52eb5fc09ef5e0985a34c3a89cb45b49ac39663659ad3c036a3d65618 b/data/database/10e4bed52eb5fc09ef5e0985a34c3a89cb45b49ac39663659ad3c036a3d65618 new file mode 100644 index 000000000000..57472ad7f80f Binary files /dev/null and b/data/database/10e4bed52eb5fc09ef5e0985a34c3a89cb45b49ac39663659ad3c036a3d65618 differ diff --git a/data/database/12303fef2ec83aa83a16d226afc4a37cd62309dac121bc404e963c2a310ffa34 b/data/database/12303fef2ec83aa83a16d226afc4a37cd62309dac121bc404e963c2a310ffa34 new file mode 100644 index 000000000000..e912fafc9d0a Binary files /dev/null and b/data/database/12303fef2ec83aa83a16d226afc4a37cd62309dac121bc404e963c2a310ffa34 differ diff --git a/data/database/0d39be36c6664e65c83d16e10eb1e498ea8adf00405c60fe221e97e6dd461d30 b/data/database/13047768323f18cbc0ebf7ffb224e042284dcd46c31134e0ed5c2e27e01714b6 similarity index 100% rename from data/database/0d39be36c6664e65c83d16e10eb1e498ea8adf00405c60fe221e97e6dd461d30 rename to data/database/13047768323f18cbc0ebf7ffb224e042284dcd46c31134e0ed5c2e27e01714b6 diff --git a/data/database/30ba5a2020f8f4c19ec16aa290c6dcf000bfaf55e750c3bdaa785f24a0c4bdfb b/data/database/1313b1e94618dfe74e43e821c68f05297bb2276c4f6d96a92b05c2f2f198edda similarity index 100% rename from data/database/30ba5a2020f8f4c19ec16aa290c6dcf000bfaf55e750c3bdaa785f24a0c4bdfb rename to data/database/1313b1e94618dfe74e43e821c68f05297bb2276c4f6d96a92b05c2f2f198edda diff --git a/data/database/13374bcd3df93806cdcd77dff54b9e8ab39b3ee8f5503e76a0707eb52b0c1dce b/data/database/13374bcd3df93806cdcd77dff54b9e8ab39b3ee8f5503e76a0707eb52b0c1dce new file mode 100644 index 000000000000..b0c4c4a7d0e1 Binary files /dev/null and b/data/database/13374bcd3df93806cdcd77dff54b9e8ab39b3ee8f5503e76a0707eb52b0c1dce differ diff --git a/data/database/15d30e35bd374d33113a105ba607821b1ff7bb751908fda6f78cf0a3d9ab674e b/data/database/15d30e35bd374d33113a105ba607821b1ff7bb751908fda6f78cf0a3d9ab674e deleted file mode 100644 index ef5a4f8200d4..000000000000 Binary files a/data/database/15d30e35bd374d33113a105ba607821b1ff7bb751908fda6f78cf0a3d9ab674e and /dev/null differ diff --git a/data/database/16611e2a29e7c23ddce11b5f1b62aa0d257cd93a848979107e0e524af0340b0c b/data/database/16611e2a29e7c23ddce11b5f1b62aa0d257cd93a848979107e0e524af0340b0c deleted file mode 100644 index 0f30785bd929..000000000000 Binary files a/data/database/16611e2a29e7c23ddce11b5f1b62aa0d257cd93a848979107e0e524af0340b0c and /dev/null differ diff --git a/data/database/16962e8b9c2d13b33883785a8071a047a373ec7cb15cbb9c790dc2c068e3a26d b/data/database/16962e8b9c2d13b33883785a8071a047a373ec7cb15cbb9c790dc2c068e3a26d deleted file mode 100644 index 6f0904e56238..000000000000 Binary files a/data/database/16962e8b9c2d13b33883785a8071a047a373ec7cb15cbb9c790dc2c068e3a26d and /dev/null differ diff --git a/data/database/16ca57ee7744a52720060323eabb6ab9db59e3b589f5c8e946e9b9965143e2ec b/data/database/16ca57ee7744a52720060323eabb6ab9db59e3b589f5c8e946e9b9965143e2ec deleted file mode 100644 index 939afc069760..000000000000 Binary files a/data/database/16ca57ee7744a52720060323eabb6ab9db59e3b589f5c8e946e9b9965143e2ec and /dev/null differ diff --git a/data/database/19dc635587bd3d757aae7a31f1104038f4581927a37611e928b3bf7dd1fb9534 b/data/database/19dc635587bd3d757aae7a31f1104038f4581927a37611e928b3bf7dd1fb9534 new file mode 100644 index 000000000000..08eedacff1f1 Binary files /dev/null and b/data/database/19dc635587bd3d757aae7a31f1104038f4581927a37611e928b3bf7dd1fb9534 differ diff --git a/data/database/19ec752ac09dc89517d89aa9d0c666e6709f6ce2ac491cd94d70420880ea4f07 b/data/database/19ec752ac09dc89517d89aa9d0c666e6709f6ce2ac491cd94d70420880ea4f07 deleted file mode 100644 index f06f728c6cb3..000000000000 Binary files a/data/database/19ec752ac09dc89517d89aa9d0c666e6709f6ce2ac491cd94d70420880ea4f07 and /dev/null differ diff --git a/data/database/1a3379ce98a43d8a109e13f31d851eab3a36fd1d311edbcbe33077742217bed6 b/data/database/1a3379ce98a43d8a109e13f31d851eab3a36fd1d311edbcbe33077742217bed6 deleted file mode 100644 index 549eec94266e..000000000000 Binary files a/data/database/1a3379ce98a43d8a109e13f31d851eab3a36fd1d311edbcbe33077742217bed6 and /dev/null differ diff --git a/data/database/0d3cf8295cffdfc71df679e20ae4ce6f92b984b435d54b5a496dac4b2bf2ec66 b/data/database/1a3d270f9bedba300686583a0606fa305380559f4998dce581cc1e02623caace similarity index 100% rename from data/database/0d3cf8295cffdfc71df679e20ae4ce6f92b984b435d54b5a496dac4b2bf2ec66 rename to data/database/1a3d270f9bedba300686583a0606fa305380559f4998dce581cc1e02623caace diff --git a/data/database/1b0422959b5881cca93fabd751993672d943e66408d866004df23aa77706c798 b/data/database/1b0422959b5881cca93fabd751993672d943e66408d866004df23aa77706c798 deleted file mode 100644 index 12fa5522eee9..000000000000 Binary files a/data/database/1b0422959b5881cca93fabd751993672d943e66408d866004df23aa77706c798 and /dev/null differ diff --git a/data/database/56e28b24b4b672053eee4cba5c0dc8eab013af0a9fb133c04fb5a3af58c4da92 b/data/database/1b99135f7912bff0c570246b753d473f7d95876dec245acf365d83fff326a88f similarity index 100% rename from data/database/56e28b24b4b672053eee4cba5c0dc8eab013af0a9fb133c04fb5a3af58c4da92 rename to data/database/1b99135f7912bff0c570246b753d473f7d95876dec245acf365d83fff326a88f diff --git a/data/database/7169dc93de16a2a608c0cf054c3b33ada38e90ffbdd10ad5789e91ec7f69244e b/data/database/1db13b7da82f7db85cf678fc7139597a40505e0a3f6209a65c73d6fadb337697 similarity index 100% rename from data/database/7169dc93de16a2a608c0cf054c3b33ada38e90ffbdd10ad5789e91ec7f69244e rename to data/database/1db13b7da82f7db85cf678fc7139597a40505e0a3f6209a65c73d6fadb337697 diff --git a/data/database/d9f91828bf1144004b88df065df3014df5e2ae3d51e994f5565f4379f7a57c3a b/data/database/1dc526566875c2034f632405c72bdebd741fdb6fcf96f6cce4e20aa4abee47ca similarity index 100% rename from data/database/d9f91828bf1144004b88df065df3014df5e2ae3d51e994f5565f4379f7a57c3a rename to data/database/1dc526566875c2034f632405c72bdebd741fdb6fcf96f6cce4e20aa4abee47ca diff --git a/data/database/1e3c03ee34c50b1d2ac75f385d2aad16bb5110f165ee23260944c1c598799711 b/data/database/1e3c03ee34c50b1d2ac75f385d2aad16bb5110f165ee23260944c1c598799711 deleted file mode 100644 index 64c3812be2a5..000000000000 Binary files a/data/database/1e3c03ee34c50b1d2ac75f385d2aad16bb5110f165ee23260944c1c598799711 and /dev/null differ diff --git a/data/database/1ed1769d3a13d0dc3fc9ed728a2ae8e841366cb7fe2eddcec2de195b8eef59e8 b/data/database/1ed1769d3a13d0dc3fc9ed728a2ae8e841366cb7fe2eddcec2de195b8eef59e8 deleted file mode 100644 index 1ea818519037..000000000000 Binary files a/data/database/1ed1769d3a13d0dc3fc9ed728a2ae8e841366cb7fe2eddcec2de195b8eef59e8 and /dev/null differ diff --git a/data/database/1f2e3903321051f0127c20016eee261b1b65d2e8451d55f4321b21afd667e46d b/data/database/1f2e3903321051f0127c20016eee261b1b65d2e8451d55f4321b21afd667e46d deleted file mode 100644 index e9b5fc081e88..000000000000 Binary files a/data/database/1f2e3903321051f0127c20016eee261b1b65d2e8451d55f4321b21afd667e46d and /dev/null differ diff --git a/data/database/1f882f68c05c3a3d38acb709020e52c2acefce8136697b495b3c50690b996dce b/data/database/1f882f68c05c3a3d38acb709020e52c2acefce8136697b495b3c50690b996dce deleted file mode 100644 index bcb026a16095..000000000000 Binary files a/data/database/1f882f68c05c3a3d38acb709020e52c2acefce8136697b495b3c50690b996dce and /dev/null differ diff --git a/data/database/20f6f0f0ccf5df5e47a47258febf28ff9d1025cbee7094ba656d99a9fe7fd333 b/data/database/20f6f0f0ccf5df5e47a47258febf28ff9d1025cbee7094ba656d99a9fe7fd333 new file mode 100644 index 000000000000..9cbba4b40418 Binary files /dev/null and b/data/database/20f6f0f0ccf5df5e47a47258febf28ff9d1025cbee7094ba656d99a9fe7fd333 differ diff --git a/data/database/8681ff97677eae0d2603d53bbb1b6e465ffa3032a1f8ec9a3452345472638ad2 b/data/database/2129fb24a20d1ef1cb9ece4b7a677bbb046ac510ec43d264b7d39d45dfa46cad similarity index 100% rename from data/database/8681ff97677eae0d2603d53bbb1b6e465ffa3032a1f8ec9a3452345472638ad2 rename to data/database/2129fb24a20d1ef1cb9ece4b7a677bbb046ac510ec43d264b7d39d45dfa46cad diff --git a/data/database/22421488dd27978d6dc93e08ab3edbdf733996683ac0af55700c48162d8131c9 b/data/database/21694c115356a6f4b912d608fb9766cce1629ed8606463386ccb4af56c560a1c similarity index 100% rename from data/database/22421488dd27978d6dc93e08ab3edbdf733996683ac0af55700c48162d8131c9 rename to data/database/21694c115356a6f4b912d608fb9766cce1629ed8606463386ccb4af56c560a1c diff --git a/data/database/1732027116a0e2ee340ab80fb00c3fe6419ab7c69ff85e7df15c9936b21ae3ce b/data/database/23bb4874a034bfc6d50511918555a70c0d84d620a5cd76b9698ae97014d8551b similarity index 100% rename from data/database/1732027116a0e2ee340ab80fb00c3fe6419ab7c69ff85e7df15c9936b21ae3ce rename to data/database/23bb4874a034bfc6d50511918555a70c0d84d620a5cd76b9698ae97014d8551b diff --git a/data/database/8d35026acb17749959d5c26621455fa0b2e6512f9feb60c903224f9f409c5535 b/data/database/24c6dc9e5eb59552f6ba23be40d5e662f40562277d40ec0d38a40d897f8b70fb similarity index 100% rename from data/database/8d35026acb17749959d5c26621455fa0b2e6512f9feb60c903224f9f409c5535 rename to data/database/24c6dc9e5eb59552f6ba23be40d5e662f40562277d40ec0d38a40d897f8b70fb diff --git a/data/database/2620884aadedc03340e7e0cda81489e4a7a88afaf3045a0a2c63afa439a0baa9 b/data/database/2620884aadedc03340e7e0cda81489e4a7a88afaf3045a0a2c63afa439a0baa9 new file mode 100644 index 000000000000..f97f30c85e9c Binary files /dev/null and b/data/database/2620884aadedc03340e7e0cda81489e4a7a88afaf3045a0a2c63afa439a0baa9 differ diff --git a/data/database/789c8d1fd23dd9f5eb60218503815d305ad56f531b95bb2773c8bd79b86bb2b3 b/data/database/26749d8cef1f2dc01660ace5a6daafe8f697aebc996d48a55db9fa03b3aeb2ec similarity index 100% rename from data/database/789c8d1fd23dd9f5eb60218503815d305ad56f531b95bb2773c8bd79b86bb2b3 rename to data/database/26749d8cef1f2dc01660ace5a6daafe8f697aebc996d48a55db9fa03b3aeb2ec diff --git a/data/database/200fcd5291377ce8136f7e149c58ca52d66e2b9b310eaaa0388aa403879051f4 b/data/database/26dc1be298d4efa8e49d3a2dc50e88be4e8ddd12dab9f9dbb8f36c0b22bdf4fb similarity index 100% rename from data/database/200fcd5291377ce8136f7e149c58ca52d66e2b9b310eaaa0388aa403879051f4 rename to data/database/26dc1be298d4efa8e49d3a2dc50e88be4e8ddd12dab9f9dbb8f36c0b22bdf4fb diff --git a/data/database/b355d5a3e01daa32784cc9c3b19bc1913eab9d6db8e251bfc6e459d4d2742f0f b/data/database/2767b60504347302b381f26675a2d83c324e4011aaf2469026b7352d82604b0a similarity index 78% rename from data/database/b355d5a3e01daa32784cc9c3b19bc1913eab9d6db8e251bfc6e459d4d2742f0f rename to data/database/2767b60504347302b381f26675a2d83c324e4011aaf2469026b7352d82604b0a index 9f7048adf155..bee94e6f68a1 100644 Binary files a/data/database/b355d5a3e01daa32784cc9c3b19bc1913eab9d6db8e251bfc6e459d4d2742f0f and b/data/database/2767b60504347302b381f26675a2d83c324e4011aaf2469026b7352d82604b0a differ diff --git a/data/database/d96cc62df0da173a3dcb7c9b4f51b8458fc8ef69499e6994e627c32cc02c6db2 b/data/database/2a4125639dd2854982eef216210f2fccb2114b2101db8aa7fcac219d0349162e similarity index 100% rename from data/database/d96cc62df0da173a3dcb7c9b4f51b8458fc8ef69499e6994e627c32cc02c6db2 rename to data/database/2a4125639dd2854982eef216210f2fccb2114b2101db8aa7fcac219d0349162e diff --git a/data/database/2a43a8b07e78cc95db7c32ecff2a39d826c4385f84b0b1b9c25433430d19fc3e b/data/database/2a43a8b07e78cc95db7c32ecff2a39d826c4385f84b0b1b9c25433430d19fc3e deleted file mode 100644 index a7f452983489..000000000000 Binary files a/data/database/2a43a8b07e78cc95db7c32ecff2a39d826c4385f84b0b1b9c25433430d19fc3e and /dev/null differ diff --git a/data/database/a58322eb85749806327483fcf2e5119d94748279d265b09a8f6608590d4446d3 b/data/database/2ca07ade47a23f58ffe33252fe050d44921fe51aedb46b9e1d0840fd9e321a99 similarity index 100% rename from data/database/a58322eb85749806327483fcf2e5119d94748279d265b09a8f6608590d4446d3 rename to data/database/2ca07ade47a23f58ffe33252fe050d44921fe51aedb46b9e1d0840fd9e321a99 diff --git a/data/database/2dfb3e6ba365c20fd17d0f35bc749423e05ea9ca867297706a64446d2e072b02 b/data/database/2dfb3e6ba365c20fd17d0f35bc749423e05ea9ca867297706a64446d2e072b02 deleted file mode 100644 index 0d4ac9612fd8..000000000000 Binary files a/data/database/2dfb3e6ba365c20fd17d0f35bc749423e05ea9ca867297706a64446d2e072b02 and /dev/null differ diff --git a/data/database/6cdd19396c9ac9e65058b09638c3dcbe26db1366ce5723b82f7f156059740c1d b/data/database/30154917ac662ae1143927b43e6146b279463a47ea9bea38b42b87b1a523c4d1 similarity index 100% rename from data/database/6cdd19396c9ac9e65058b09638c3dcbe26db1366ce5723b82f7f156059740c1d rename to data/database/30154917ac662ae1143927b43e6146b279463a47ea9bea38b42b87b1a523c4d1 diff --git a/data/database/320ca8cd707ae119ca2a02c24c7be95c10e0790ba076c355086a5c837feb6fe6 b/data/database/320ca8cd707ae119ca2a02c24c7be95c10e0790ba076c355086a5c837feb6fe6 deleted file mode 100644 index f0daa91b4333..000000000000 Binary files a/data/database/320ca8cd707ae119ca2a02c24c7be95c10e0790ba076c355086a5c837feb6fe6 and /dev/null differ diff --git a/data/database/071071b5fd8ae2538328d6c30242b959d54d74c13c6bb477aa82077c2b637b54 b/data/database/32285325848420b087baab12d5de1da42944b6dad68f83dd52a38df6a63bac13 similarity index 100% rename from data/database/071071b5fd8ae2538328d6c30242b959d54d74c13c6bb477aa82077c2b637b54 rename to data/database/32285325848420b087baab12d5de1da42944b6dad68f83dd52a38df6a63bac13 diff --git a/data/database/5e3a51e5b137a2924e1e9784b45ea7307d0c71c0b85845d63cae144392f4f78c b/data/database/322ffdc64929e3d6f17dba281fce4f331a847dd354692b369a2b56a4c15520a4 similarity index 100% rename from data/database/5e3a51e5b137a2924e1e9784b45ea7307d0c71c0b85845d63cae144392f4f78c rename to data/database/322ffdc64929e3d6f17dba281fce4f331a847dd354692b369a2b56a4c15520a4 diff --git a/data/database/3313dd9868eaa9978fc72ab0a4595f100a985f13c91e3d76391ffbe3a9a22cb6 b/data/database/3313dd9868eaa9978fc72ab0a4595f100a985f13c91e3d76391ffbe3a9a22cb6 deleted file mode 100644 index 5f1421f43ac0..000000000000 Binary files a/data/database/3313dd9868eaa9978fc72ab0a4595f100a985f13c91e3d76391ffbe3a9a22cb6 and /dev/null differ diff --git a/data/database/00c725b43931fc44cbe08d04c5743dda181e025632a714f2d0ae53283f07b6fc b/data/database/33f93c32ab09b46f1e5a3b0f14f4613f2b5bf98c112bf0ec6c2aea1d3d595dc7 similarity index 100% rename from data/database/00c725b43931fc44cbe08d04c5743dda181e025632a714f2d0ae53283f07b6fc rename to data/database/33f93c32ab09b46f1e5a3b0f14f4613f2b5bf98c112bf0ec6c2aea1d3d595dc7 diff --git a/data/database/342b3556b37607adf267a210e70476e75db06e52628b5be820083df1290a6cd0 b/data/database/342b3556b37607adf267a210e70476e75db06e52628b5be820083df1290a6cd0 deleted file mode 100644 index 2f03d4eb53b5..000000000000 Binary files a/data/database/342b3556b37607adf267a210e70476e75db06e52628b5be820083df1290a6cd0 and /dev/null differ diff --git a/data/database/34760f56c0858ce784edcb12db42e403128891ec0860a381c8b5a097c6408b4d b/data/database/34760f56c0858ce784edcb12db42e403128891ec0860a381c8b5a097c6408b4d deleted file mode 100644 index 810ccce91dd1..000000000000 Binary files a/data/database/34760f56c0858ce784edcb12db42e403128891ec0860a381c8b5a097c6408b4d and /dev/null differ diff --git a/data/database/e3bd03f046073947ed37d8273b9fa1fef5f24e78c7004083dcaddd14b3538d61 b/data/database/347e652cf328c2159251fa49dbbd620277b7f13b4f503d373833d0cfcf992222 similarity index 100% rename from data/database/e3bd03f046073947ed37d8273b9fa1fef5f24e78c7004083dcaddd14b3538d61 rename to data/database/347e652cf328c2159251fa49dbbd620277b7f13b4f503d373833d0cfcf992222 diff --git a/data/database/34fda226dce6576432d03933c2df014a15146ca18fdc64af9f091167814ea9a4 b/data/database/34fda226dce6576432d03933c2df014a15146ca18fdc64af9f091167814ea9a4 deleted file mode 100644 index 730b220fac2b..000000000000 Binary files a/data/database/34fda226dce6576432d03933c2df014a15146ca18fdc64af9f091167814ea9a4 and /dev/null differ diff --git a/data/database/9fe93ba8790ab21691b80af72cb6f912148ade38ba5513274d1b8efa9b34b88a b/data/database/356764ac25b52636ebf63f6dd4bdfbfc9ba461804dd58f40e6348d5862a47378 similarity index 100% rename from data/database/9fe93ba8790ab21691b80af72cb6f912148ade38ba5513274d1b8efa9b34b88a rename to data/database/356764ac25b52636ebf63f6dd4bdfbfc9ba461804dd58f40e6348d5862a47378 diff --git a/data/database/cb519d9ab689dc3f18956d0bc03fa153f43ed3c7cd5f0e4ae6c637c13fdc95b6 b/data/database/369388565cd90cbb90d165e6ac594ce00d67d6c97c9ec6a52d32f7f3afdf7057 similarity index 100% rename from data/database/cb519d9ab689dc3f18956d0bc03fa153f43ed3c7cd5f0e4ae6c637c13fdc95b6 rename to data/database/369388565cd90cbb90d165e6ac594ce00d67d6c97c9ec6a52d32f7f3afdf7057 diff --git a/data/database/e743ac873ca0e2bb859db06f4de2f8ac1bac2370dfdd6a52cd4479650914d1af b/data/database/36ab4ff37d8a4ef27b61020877c3f8cbb18fe17eff4c4e1d49b9e88ee98913bd similarity index 100% rename from data/database/e743ac873ca0e2bb859db06f4de2f8ac1bac2370dfdd6a52cd4479650914d1af rename to data/database/36ab4ff37d8a4ef27b61020877c3f8cbb18fe17eff4c4e1d49b9e88ee98913bd diff --git a/data/database/37dbcae97882562e3dd35c10aa6bbc6241f52df0da066f63557a1cf890fc62e0 b/data/database/37dbcae97882562e3dd35c10aa6bbc6241f52df0da066f63557a1cf890fc62e0 deleted file mode 100644 index a1704b5294ce..000000000000 Binary files a/data/database/37dbcae97882562e3dd35c10aa6bbc6241f52df0da066f63557a1cf890fc62e0 and /dev/null differ diff --git a/data/database/26768739b0789c9916a487dce072bb09073ba630d5f284baba64a38a990f47c3 b/data/database/380abcabc7265a467c460c8edec638c8c23f9db45ad168024ccbc287dc2e1683 similarity index 100% rename from data/database/26768739b0789c9916a487dce072bb09073ba630d5f284baba64a38a990f47c3 rename to data/database/380abcabc7265a467c460c8edec638c8c23f9db45ad168024ccbc287dc2e1683 diff --git a/data/database/7f439159ea13c43d345c7e291bb2b5b9abf66686218bb60f1b5ed1c1672e7341 b/data/database/38d3463f5299aa9e4cd5c55480cabbbb80aa7bc735debe2601cf0d06876c6a59 similarity index 100% rename from data/database/7f439159ea13c43d345c7e291bb2b5b9abf66686218bb60f1b5ed1c1672e7341 rename to data/database/38d3463f5299aa9e4cd5c55480cabbbb80aa7bc735debe2601cf0d06876c6a59 diff --git a/data/database/3a1b7979d2297909b1d69575c77a8fac9d53001d9190b0b8ed17dceec97f2490 b/data/database/3a1b7979d2297909b1d69575c77a8fac9d53001d9190b0b8ed17dceec97f2490 deleted file mode 100644 index c547b2931e1f..000000000000 Binary files a/data/database/3a1b7979d2297909b1d69575c77a8fac9d53001d9190b0b8ed17dceec97f2490 and /dev/null differ diff --git a/data/database/3a93cb73b0352fc9eabdfe910ea47cca219523d24e08f39a1d2f3f2dbd40bcd6 b/data/database/3a93cb73b0352fc9eabdfe910ea47cca219523d24e08f39a1d2f3f2dbd40bcd6 deleted file mode 100644 index bd1b2c2eb78e..000000000000 Binary files a/data/database/3a93cb73b0352fc9eabdfe910ea47cca219523d24e08f39a1d2f3f2dbd40bcd6 and /dev/null differ diff --git a/data/database/3cc24d77217b0ab2624e759442d49dae743b9b9f2f0eba64cc97fca0e6abe004 b/data/database/3cc24d77217b0ab2624e759442d49dae743b9b9f2f0eba64cc97fca0e6abe004 new file mode 100644 index 000000000000..5af5115e5c06 Binary files /dev/null and b/data/database/3cc24d77217b0ab2624e759442d49dae743b9b9f2f0eba64cc97fca0e6abe004 differ diff --git a/data/database/3d34e6b5f05408b3bf6daee964214a72173f0656d77940ce66399666a0d47889 b/data/database/3d34e6b5f05408b3bf6daee964214a72173f0656d77940ce66399666a0d47889 deleted file mode 100644 index 2f57e7d35c04..000000000000 Binary files a/data/database/3d34e6b5f05408b3bf6daee964214a72173f0656d77940ce66399666a0d47889 and /dev/null differ diff --git a/data/database/e3c080aa5e6fd504637deaef1d6345bac57aad4fdc1dcc76088f0e80a5deac94 b/data/database/3f7308a98880841fe88a2cdb5afdd4ae274f715cc223422527598b1489158171 similarity index 100% rename from data/database/e3c080aa5e6fd504637deaef1d6345bac57aad4fdc1dcc76088f0e80a5deac94 rename to data/database/3f7308a98880841fe88a2cdb5afdd4ae274f715cc223422527598b1489158171 diff --git a/data/database/3f8c8e926f93a3043b7aa9c5f79f4cae5791681d9d4538a3f68de7d4a13719df b/data/database/3f8c8e926f93a3043b7aa9c5f79f4cae5791681d9d4538a3f68de7d4a13719df deleted file mode 100644 index 158f374f5d95..000000000000 Binary files a/data/database/3f8c8e926f93a3043b7aa9c5f79f4cae5791681d9d4538a3f68de7d4a13719df and /dev/null differ diff --git a/data/database/96cfe9c4d0fd8c52249cc19cb19b27f8c10c27ef86c5666adb6d6890d21c94a5 b/data/database/403525671debee38c4d682df2c159d622c1127cb867c4dc270d5ca6069576bdb similarity index 62% rename from data/database/96cfe9c4d0fd8c52249cc19cb19b27f8c10c27ef86c5666adb6d6890d21c94a5 rename to data/database/403525671debee38c4d682df2c159d622c1127cb867c4dc270d5ca6069576bdb index be4e2ffce805..00aef6d253d7 100644 Binary files a/data/database/96cfe9c4d0fd8c52249cc19cb19b27f8c10c27ef86c5666adb6d6890d21c94a5 and b/data/database/403525671debee38c4d682df2c159d622c1127cb867c4dc270d5ca6069576bdb differ diff --git a/data/database/c06a8338715738b07b342d89c585a668001c1c922c42b5c12b915d7402048004 b/data/database/4184fc4e3335ca64a57298e997938b0cd590ea20789f65a10c26dd0112d423d0 similarity index 93% rename from data/database/c06a8338715738b07b342d89c585a668001c1c922c42b5c12b915d7402048004 rename to data/database/4184fc4e3335ca64a57298e997938b0cd590ea20789f65a10c26dd0112d423d0 index 25b06707877c..85ad499bcbdd 100644 Binary files a/data/database/c06a8338715738b07b342d89c585a668001c1c922c42b5c12b915d7402048004 and b/data/database/4184fc4e3335ca64a57298e997938b0cd590ea20789f65a10c26dd0112d423d0 differ diff --git a/data/database/57d485097e12a7a2d9cf9f550697c8ff14e4dea385a7293fc445de2c276506db b/data/database/41c5e862a19fb7252a09f275e77516b73e031bc65072783d18c680528ea12e30 similarity index 100% rename from data/database/57d485097e12a7a2d9cf9f550697c8ff14e4dea385a7293fc445de2c276506db rename to data/database/41c5e862a19fb7252a09f275e77516b73e031bc65072783d18c680528ea12e30 diff --git a/data/database/3433074086b271e3cfbedeb890a4178848ee1b3963718b3ad212d22a28ac0fff b/data/database/4294f37fe7de7d1f5dccd0ed555c82dfb679db875ca2f086b5245eeb5c1de494 similarity index 100% rename from data/database/3433074086b271e3cfbedeb890a4178848ee1b3963718b3ad212d22a28ac0fff rename to data/database/4294f37fe7de7d1f5dccd0ed555c82dfb679db875ca2f086b5245eeb5c1de494 diff --git a/data/database/3619be639ab593da656171033849b2f0c6434298ad0abe52accacf318b5d150f b/data/database/43aa062a660ea23adf0155d42a4718c0e4aa2da940ee5755f8dbac4ca4b242dd similarity index 100% rename from data/database/3619be639ab593da656171033849b2f0c6434298ad0abe52accacf318b5d150f rename to data/database/43aa062a660ea23adf0155d42a4718c0e4aa2da940ee5755f8dbac4ca4b242dd diff --git a/data/database/6e6ce6df0642cc649ddbbaf94fbc5e94c8a0a50896e400cc016c3d6584907c14 b/data/database/44bcd715e6820aca2da68087fe5265407a58864d745a1cca35ea4346cdcb0f44 similarity index 100% rename from data/database/6e6ce6df0642cc649ddbbaf94fbc5e94c8a0a50896e400cc016c3d6584907c14 rename to data/database/44bcd715e6820aca2da68087fe5265407a58864d745a1cca35ea4346cdcb0f44 diff --git a/data/database/46b6a742a582995a1007ac96d164d0e9ebe7506f3b4dec29afd05b561e7aa3b9 b/data/database/46b6a742a582995a1007ac96d164d0e9ebe7506f3b4dec29afd05b561e7aa3b9 deleted file mode 100644 index f4da4ee4c23f..000000000000 Binary files a/data/database/46b6a742a582995a1007ac96d164d0e9ebe7506f3b4dec29afd05b561e7aa3b9 and /dev/null differ diff --git a/data/database/4726b2b456c594a3f28f0c1d52dbcb37b7e0effea71aa9b8a2bf25b79d52faa8 b/data/database/4726b2b456c594a3f28f0c1d52dbcb37b7e0effea71aa9b8a2bf25b79d52faa8 deleted file mode 100644 index e098f11a9f1b..000000000000 Binary files a/data/database/4726b2b456c594a3f28f0c1d52dbcb37b7e0effea71aa9b8a2bf25b79d52faa8 and /dev/null differ diff --git a/data/database/47a559fc3768aa00a686683acb1242c05d3585ceb3720d516346f85dc873452c b/data/database/47a559fc3768aa00a686683acb1242c05d3585ceb3720d516346f85dc873452c deleted file mode 100644 index 670f9f031a94..000000000000 Binary files a/data/database/47a559fc3768aa00a686683acb1242c05d3585ceb3720d516346f85dc873452c and /dev/null differ diff --git a/data/database/4b4fa170eca7f38b929d2d4206d2b87c5ec9ae2c3aa140c7b5c51eba661561ef b/data/database/4864c059c367d63cbaace8736c4a060bb25482b33cfa0c3fad882f596688c823 similarity index 100% rename from data/database/4b4fa170eca7f38b929d2d4206d2b87c5ec9ae2c3aa140c7b5c51eba661561ef rename to data/database/4864c059c367d63cbaace8736c4a060bb25482b33cfa0c3fad882f596688c823 diff --git a/data/database/487dcfab99073f346ffcab408337c55696b995ec0c2d548e86c246fced34e0f8 b/data/database/487dcfab99073f346ffcab408337c55696b995ec0c2d548e86c246fced34e0f8 deleted file mode 100644 index cf67f38c4c92..000000000000 Binary files a/data/database/487dcfab99073f346ffcab408337c55696b995ec0c2d548e86c246fced34e0f8 and /dev/null differ diff --git a/data/database/4887856c2d2dabf0533e79c5238af66500479a9bb8fac7d3ed1d6e5bc88668ca b/data/database/4887856c2d2dabf0533e79c5238af66500479a9bb8fac7d3ed1d6e5bc88668ca deleted file mode 100644 index 9c2f5a2f2af0..000000000000 Binary files a/data/database/4887856c2d2dabf0533e79c5238af66500479a9bb8fac7d3ed1d6e5bc88668ca and /dev/null differ diff --git a/data/database/495e19c6f88b478424336d6f419ea277a30248a8b3e137d0588fdca5b7c25b84 b/data/database/495e19c6f88b478424336d6f419ea277a30248a8b3e137d0588fdca5b7c25b84 deleted file mode 100644 index aa9aec405e29..000000000000 Binary files a/data/database/495e19c6f88b478424336d6f419ea277a30248a8b3e137d0588fdca5b7c25b84 and /dev/null differ diff --git a/data/database/4a2916bfcc490adced6c35c90c92d297d35d5ead9d76ba82226ccaef65ededb9 b/data/database/4a2916bfcc490adced6c35c90c92d297d35d5ead9d76ba82226ccaef65ededb9 new file mode 100644 index 000000000000..0baeb77b9d0e Binary files /dev/null and b/data/database/4a2916bfcc490adced6c35c90c92d297d35d5ead9d76ba82226ccaef65ededb9 differ diff --git a/data/database/b642c5567babdf3e450fe9c2fbb45f952ca7590c8b1f91da7ce3e55f53057091 b/data/database/4a484aa487d36da07c3fdc14b311e02e0cd108d13c36650dba084353d252e0b6 similarity index 85% rename from data/database/b642c5567babdf3e450fe9c2fbb45f952ca7590c8b1f91da7ce3e55f53057091 rename to data/database/4a484aa487d36da07c3fdc14b311e02e0cd108d13c36650dba084353d252e0b6 index 20ea95642f1d..08a632a431da 100644 Binary files a/data/database/b642c5567babdf3e450fe9c2fbb45f952ca7590c8b1f91da7ce3e55f53057091 and b/data/database/4a484aa487d36da07c3fdc14b311e02e0cd108d13c36650dba084353d252e0b6 differ diff --git a/data/database/edd669971f0fd1b70ceffff46f2c0e8dff3a997ef7fbcaabcdd39589972ecf96 b/data/database/4c6dc04c5dd7eefc1a669806395614b411aef858d8209e74d2a58f624f0f2b06 similarity index 99% rename from data/database/edd669971f0fd1b70ceffff46f2c0e8dff3a997ef7fbcaabcdd39589972ecf96 rename to data/database/4c6dc04c5dd7eefc1a669806395614b411aef858d8209e74d2a58f624f0f2b06 index bf13ff94b2a0..945d94b98571 100644 Binary files a/data/database/edd669971f0fd1b70ceffff46f2c0e8dff3a997ef7fbcaabcdd39589972ecf96 and b/data/database/4c6dc04c5dd7eefc1a669806395614b411aef858d8209e74d2a58f624f0f2b06 differ diff --git a/data/database/18c20b1da56e378fbe028b029d1670cda9ce07fedef7965f0fb3e6c53ed09f8a b/data/database/4f251273cdd4192472b61f9603187e54bf7c018e98b51feb3b8b632443fd9b50 similarity index 94% rename from data/database/18c20b1da56e378fbe028b029d1670cda9ce07fedef7965f0fb3e6c53ed09f8a rename to data/database/4f251273cdd4192472b61f9603187e54bf7c018e98b51feb3b8b632443fd9b50 index 5395d601194a..726da2ba7313 100644 Binary files a/data/database/18c20b1da56e378fbe028b029d1670cda9ce07fedef7965f0fb3e6c53ed09f8a and b/data/database/4f251273cdd4192472b61f9603187e54bf7c018e98b51feb3b8b632443fd9b50 differ diff --git a/data/database/4f987a13eb0ed4b005f1d29fd18b897fedfb9f2975c9dfee3229c227185c4e1d b/data/database/4f987a13eb0ed4b005f1d29fd18b897fedfb9f2975c9dfee3229c227185c4e1d deleted file mode 100644 index 70a4a0ece478..000000000000 Binary files a/data/database/4f987a13eb0ed4b005f1d29fd18b897fedfb9f2975c9dfee3229c227185c4e1d and /dev/null differ diff --git a/data/database/d406a0754015fdaa90eb473821c00589c66c9a35445cdacb78f6c30738cb2e24 b/data/database/50add0b92e4d7b68b2b0ad50206dfcd72b4660250cf0ecfa5d8716198a99923b similarity index 100% rename from data/database/d406a0754015fdaa90eb473821c00589c66c9a35445cdacb78f6c30738cb2e24 rename to data/database/50add0b92e4d7b68b2b0ad50206dfcd72b4660250cf0ecfa5d8716198a99923b diff --git a/data/database/513bc260244991bd4a73dd87e7666c66686bdda60da57ade4f2156f66349de41 b/data/database/513bc260244991bd4a73dd87e7666c66686bdda60da57ade4f2156f66349de41 deleted file mode 100644 index 52977625941b..000000000000 Binary files a/data/database/513bc260244991bd4a73dd87e7666c66686bdda60da57ade4f2156f66349de41 and /dev/null differ diff --git a/data/database/51e0282b062a273ac7d3db8bcf155096ac41bffb9190270c9078c1ce94e9590a b/data/database/51e0282b062a273ac7d3db8bcf155096ac41bffb9190270c9078c1ce94e9590a deleted file mode 100644 index 14f1aafe67cd..000000000000 Binary files a/data/database/51e0282b062a273ac7d3db8bcf155096ac41bffb9190270c9078c1ce94e9590a and /dev/null differ diff --git a/data/database/5232e52b3118976acde5a92913184342c79fa3af16921e4405216eae986db0f2 b/data/database/5232e52b3118976acde5a92913184342c79fa3af16921e4405216eae986db0f2 deleted file mode 100644 index dd905142dccc..000000000000 Binary files a/data/database/5232e52b3118976acde5a92913184342c79fa3af16921e4405216eae986db0f2 and /dev/null differ diff --git a/data/database/523be3cc9a8e6893f5244a0e96253f1b0ca14b505ce3e063d843c2846a0e6346 b/data/database/523be3cc9a8e6893f5244a0e96253f1b0ca14b505ce3e063d843c2846a0e6346 deleted file mode 100644 index 734c14c1feb9..000000000000 Binary files a/data/database/523be3cc9a8e6893f5244a0e96253f1b0ca14b505ce3e063d843c2846a0e6346 and /dev/null differ diff --git a/data/database/52891c928f39b1d30942a2250264d19bd7ab5326ad7d3b6d47bc04fbd3c52e16 b/data/database/52891c928f39b1d30942a2250264d19bd7ab5326ad7d3b6d47bc04fbd3c52e16 deleted file mode 100644 index 37ea87e2ab24..000000000000 Binary files a/data/database/52891c928f39b1d30942a2250264d19bd7ab5326ad7d3b6d47bc04fbd3c52e16 and /dev/null differ diff --git a/data/database/52972b774270bbac77ccf6b5b6b577f37e488359c3119126c76e0f15f59ef28b b/data/database/52972b774270bbac77ccf6b5b6b577f37e488359c3119126c76e0f15f59ef28b deleted file mode 100644 index 1120ad387cfb..000000000000 Binary files a/data/database/52972b774270bbac77ccf6b5b6b577f37e488359c3119126c76e0f15f59ef28b and /dev/null differ diff --git a/data/database/8624bef59f32f7926eba9408584519c763d95766adf319cbd5bb541dd3b60e18 b/data/database/53529a007bb81389e9b2153269e26ff6b1051bff19654f2f4a137e75517209cd similarity index 100% rename from data/database/8624bef59f32f7926eba9408584519c763d95766adf319cbd5bb541dd3b60e18 rename to data/database/53529a007bb81389e9b2153269e26ff6b1051bff19654f2f4a137e75517209cd diff --git a/data/database/53b3cd9320a82f7b8d6c4bd50a30b4ccdb67e607dccabf366daac2d86cbf53c8 b/data/database/53b3cd9320a82f7b8d6c4bd50a30b4ccdb67e607dccabf366daac2d86cbf53c8 new file mode 100644 index 000000000000..207a44b3a4e4 Binary files /dev/null and b/data/database/53b3cd9320a82f7b8d6c4bd50a30b4ccdb67e607dccabf366daac2d86cbf53c8 differ diff --git a/data/database/55e2a0a0fedca6b6d38fcd64ddfeded740ae32174b805ef3568e3ffef3de9cb5 b/data/database/55e2a0a0fedca6b6d38fcd64ddfeded740ae32174b805ef3568e3ffef3de9cb5 deleted file mode 100644 index f8a0b6c23ae3..000000000000 Binary files a/data/database/55e2a0a0fedca6b6d38fcd64ddfeded740ae32174b805ef3568e3ffef3de9cb5 and /dev/null differ diff --git a/data/database/4d55699df1d4586cb74e4642d4c96eb8dc8c524353360ee19a6ecab981743912 b/data/database/5728b6aefecc888edb62baadc543273c04ecf1d2a6001c4a1d4cd8c0f2801e41 similarity index 100% rename from data/database/4d55699df1d4586cb74e4642d4c96eb8dc8c524353360ee19a6ecab981743912 rename to data/database/5728b6aefecc888edb62baadc543273c04ecf1d2a6001c4a1d4cd8c0f2801e41 diff --git a/data/database/59a6189086115b5d5ae79792052ef75b38d1e5c0feda648a7bac69841a0fb858 b/data/database/59a6189086115b5d5ae79792052ef75b38d1e5c0feda648a7bac69841a0fb858 deleted file mode 100644 index e4a66782c40a..000000000000 Binary files a/data/database/59a6189086115b5d5ae79792052ef75b38d1e5c0feda648a7bac69841a0fb858 and /dev/null differ diff --git a/data/database/fb4f92bb8089121b51135bb2c9adb5c1f0dd861e88ae009cbf2b8b6c2ecf4dcd b/data/database/5a227318dd483d613ae4d207ca7aa4b3cc1fda7ab13447249785cadbea75b897 similarity index 100% rename from data/database/fb4f92bb8089121b51135bb2c9adb5c1f0dd861e88ae009cbf2b8b6c2ecf4dcd rename to data/database/5a227318dd483d613ae4d207ca7aa4b3cc1fda7ab13447249785cadbea75b897 diff --git a/data/database/1b747bc33b59a3e975f175b0edf23607db5e1b55ab3a339834c6d1ad3dd0a73b b/data/database/5acc9f4d9fbba89e9dad21d427b5b7342617ae06f2200171370c86aa4c71bcb7 similarity index 100% rename from data/database/1b747bc33b59a3e975f175b0edf23607db5e1b55ab3a339834c6d1ad3dd0a73b rename to data/database/5acc9f4d9fbba89e9dad21d427b5b7342617ae06f2200171370c86aa4c71bcb7 diff --git a/data/database/867fe3f8efffdc4f47fbc876895023e8fe0bd440eeaa05a81fc7afe4610a7d58 b/data/database/5b1543690b144915f1cdae835f739ed099a43a4726db680c5b9ab00bf0d64d82 similarity index 96% rename from data/database/867fe3f8efffdc4f47fbc876895023e8fe0bd440eeaa05a81fc7afe4610a7d58 rename to data/database/5b1543690b144915f1cdae835f739ed099a43a4726db680c5b9ab00bf0d64d82 index c547b2931e1f..507d7c1304f5 100644 Binary files a/data/database/867fe3f8efffdc4f47fbc876895023e8fe0bd440eeaa05a81fc7afe4610a7d58 and b/data/database/5b1543690b144915f1cdae835f739ed099a43a4726db680c5b9ab00bf0d64d82 differ diff --git a/data/database/5be5bf9623e3c89648af1f1cd13bf2ecb9295a1d231fe89b228491ffc0bc3f78 b/data/database/5be5bf9623e3c89648af1f1cd13bf2ecb9295a1d231fe89b228491ffc0bc3f78 deleted file mode 100644 index 8791ace3630d..000000000000 Binary files a/data/database/5be5bf9623e3c89648af1f1cd13bf2ecb9295a1d231fe89b228491ffc0bc3f78 and /dev/null differ diff --git a/data/database/5c2f2bb95897c85d7eaf772e0441740beeca127d0d2df3df04fd3b1b40d44c68 b/data/database/5c2f2bb95897c85d7eaf772e0441740beeca127d0d2df3df04fd3b1b40d44c68 deleted file mode 100644 index 4c120322fe56..000000000000 Binary files a/data/database/5c2f2bb95897c85d7eaf772e0441740beeca127d0d2df3df04fd3b1b40d44c68 and /dev/null differ diff --git a/data/database/5c304b396a2905362f20ca778b26e1264f33f76f903e7ac2fdd53a1f2a8cb358 b/data/database/5c304b396a2905362f20ca778b26e1264f33f76f903e7ac2fdd53a1f2a8cb358 new file mode 100644 index 000000000000..0361c9bd4b43 Binary files /dev/null and b/data/database/5c304b396a2905362f20ca778b26e1264f33f76f903e7ac2fdd53a1f2a8cb358 differ diff --git a/data/database/5cd14ca8480a75ac54420eb2ceba6a0755cde4d2331b66d28c3f5c2a9a2899c6 b/data/database/5cd14ca8480a75ac54420eb2ceba6a0755cde4d2331b66d28c3f5c2a9a2899c6 deleted file mode 100644 index 2cf69ff2a4f1..000000000000 Binary files a/data/database/5cd14ca8480a75ac54420eb2ceba6a0755cde4d2331b66d28c3f5c2a9a2899c6 and /dev/null differ diff --git a/data/database/18ba8e17afd9dd359ab5630c9dd285923dd21516aa8fb63875644851349a812c b/data/database/5d9569838568198d18e61e3a470becd613101fb9f4685749b0ad6f0227748273 similarity index 100% rename from data/database/18ba8e17afd9dd359ab5630c9dd285923dd21516aa8fb63875644851349a812c rename to data/database/5d9569838568198d18e61e3a470becd613101fb9f4685749b0ad6f0227748273 diff --git a/data/database/39d99a8f2c211867247d2d1fea723802bbcc0daf9e0f3c484cc1b1662a43e102 b/data/database/5de04419d92bc0b573e891bd3a9e8e41aea074e56b3b1661cbe22b086444c414 similarity index 100% rename from data/database/39d99a8f2c211867247d2d1fea723802bbcc0daf9e0f3c484cc1b1662a43e102 rename to data/database/5de04419d92bc0b573e891bd3a9e8e41aea074e56b3b1661cbe22b086444c414 diff --git a/data/database/5ecdbd63becc2685b21702566df4f84aae382f262ad07a1c2b78d1202196ba59 b/data/database/5ecdbd63becc2685b21702566df4f84aae382f262ad07a1c2b78d1202196ba59 deleted file mode 100644 index 173554343e90..000000000000 Binary files a/data/database/5ecdbd63becc2685b21702566df4f84aae382f262ad07a1c2b78d1202196ba59 and /dev/null differ diff --git a/data/database/4bffeec961a41f6c4169d411e6400cfc3914b17876be0aea1be45dbcaf180bde b/data/database/5fc8b6d8b696067a998a6ca48384ac031145437e0618566e94b994504fae99ac similarity index 100% rename from data/database/4bffeec961a41f6c4169d411e6400cfc3914b17876be0aea1be45dbcaf180bde rename to data/database/5fc8b6d8b696067a998a6ca48384ac031145437e0618566e94b994504fae99ac diff --git a/data/database/616c1d549e7de96e42badc2b01868781bdda527e30f434dad443f94b2a05e4a3 b/data/database/616c1d549e7de96e42badc2b01868781bdda527e30f434dad443f94b2a05e4a3 deleted file mode 100644 index ac64e5345ae9..000000000000 Binary files a/data/database/616c1d549e7de96e42badc2b01868781bdda527e30f434dad443f94b2a05e4a3 and /dev/null differ diff --git a/data/database/7f4d4a49ba5006293ef765774c1ab79afb83dfb3eb23aa61062a0e8152dadf4a b/data/database/6236eb9db072cfb5dc085d08f4aa9256e7bf240862ea0e3c85fa7d1b11a7202c similarity index 84% rename from data/database/7f4d4a49ba5006293ef765774c1ab79afb83dfb3eb23aa61062a0e8152dadf4a rename to data/database/6236eb9db072cfb5dc085d08f4aa9256e7bf240862ea0e3c85fa7d1b11a7202c index 3e3c224dfca4..61d31032f606 100644 Binary files a/data/database/7f4d4a49ba5006293ef765774c1ab79afb83dfb3eb23aa61062a0e8152dadf4a and b/data/database/6236eb9db072cfb5dc085d08f4aa9256e7bf240862ea0e3c85fa7d1b11a7202c differ diff --git a/data/database/635406cc1841adc9ffb3b3a41315348b23572e71455d3eeac0d967e5d0586c84 b/data/database/635406cc1841adc9ffb3b3a41315348b23572e71455d3eeac0d967e5d0586c84 deleted file mode 100644 index 6aacff0c4913..000000000000 Binary files a/data/database/635406cc1841adc9ffb3b3a41315348b23572e71455d3eeac0d967e5d0586c84 and /dev/null differ diff --git a/data/database/63809b2984cf19e6d9807fcd3a335e2d7630c0fff45dda21eb43f9bd84f58f8e b/data/database/63809b2984cf19e6d9807fcd3a335e2d7630c0fff45dda21eb43f9bd84f58f8e deleted file mode 100644 index 56f7ff94c1e8..000000000000 Binary files a/data/database/63809b2984cf19e6d9807fcd3a335e2d7630c0fff45dda21eb43f9bd84f58f8e and /dev/null differ diff --git a/data/database/adaa57240bd7fe2cc13504d090f106f8abae153d0be0a147fea253b76fea5cd2 b/data/database/6440e0e2820d7dc68e837148b4841c3182a8597a1cdda6d9161d2ca8df249540 similarity index 100% rename from data/database/adaa57240bd7fe2cc13504d090f106f8abae153d0be0a147fea253b76fea5cd2 rename to data/database/6440e0e2820d7dc68e837148b4841c3182a8597a1cdda6d9161d2ca8df249540 diff --git a/data/database/64f8fe776192fe9cd5547e4d9b370dc113543cbfb048e4873430594609c50abd b/data/database/64f8fe776192fe9cd5547e4d9b370dc113543cbfb048e4873430594609c50abd deleted file mode 100644 index de8751525856..000000000000 Binary files a/data/database/64f8fe776192fe9cd5547e4d9b370dc113543cbfb048e4873430594609c50abd and /dev/null differ diff --git a/data/database/2c1cb4c6a522f5fd2114d42a9397a877d0694a20f2552e8fe188e0a4508e27af b/data/database/654ec4838a7ded0dd302d98bd3a459040a62d6702e8a413bfdd21bbcd588d8fd similarity index 100% rename from data/database/2c1cb4c6a522f5fd2114d42a9397a877d0694a20f2552e8fe188e0a4508e27af rename to data/database/654ec4838a7ded0dd302d98bd3a459040a62d6702e8a413bfdd21bbcd588d8fd diff --git a/data/database/bb1cf217d622a91a5bffa7fcf7f5729b91f72a34c9509a89ea0f67ae7da2f045 b/data/database/65dc6d70c095c2a4f88997e6acfe731ac23f5aaac7613978c88625cabbf03b82 similarity index 100% rename from data/database/bb1cf217d622a91a5bffa7fcf7f5729b91f72a34c9509a89ea0f67ae7da2f045 rename to data/database/65dc6d70c095c2a4f88997e6acfe731ac23f5aaac7613978c88625cabbf03b82 diff --git a/data/database/673cbecdd0d6f4bfc2ca1aab01732d9d31f1f0025c2e536bf3327adbd2833679 b/data/database/673cbecdd0d6f4bfc2ca1aab01732d9d31f1f0025c2e536bf3327adbd2833679 deleted file mode 100644 index 7ae783e1180d..000000000000 Binary files a/data/database/673cbecdd0d6f4bfc2ca1aab01732d9d31f1f0025c2e536bf3327adbd2833679 and /dev/null differ diff --git a/data/database/8a7514ac2e78a263a09be94ee5d86efd65530666a040068d9018d7592767c2c0 b/data/database/678589bdba76524fcd2d4810ef19b8a3fd2a7973e7fb55d9e6424a44c22619e6 similarity index 100% rename from data/database/8a7514ac2e78a263a09be94ee5d86efd65530666a040068d9018d7592767c2c0 rename to data/database/678589bdba76524fcd2d4810ef19b8a3fd2a7973e7fb55d9e6424a44c22619e6 diff --git a/data/database/692dc673494ad67d2c1c53dd0856b952be9a9424e0c723c4153a7cb408b39798 b/data/database/692dc673494ad67d2c1c53dd0856b952be9a9424e0c723c4153a7cb408b39798 deleted file mode 100644 index 16e8d6df02f0..000000000000 Binary files a/data/database/692dc673494ad67d2c1c53dd0856b952be9a9424e0c723c4153a7cb408b39798 and /dev/null differ diff --git a/data/database/6949182baf1fd348bd5b96ab65c2d2cfc817fc463c67251d458664a67abbb7ca b/data/database/6949182baf1fd348bd5b96ab65c2d2cfc817fc463c67251d458664a67abbb7ca deleted file mode 100644 index 9667f396ea06..000000000000 Binary files a/data/database/6949182baf1fd348bd5b96ab65c2d2cfc817fc463c67251d458664a67abbb7ca and /dev/null differ diff --git a/data/database/698ef628ee4a4f5503719dd446a418bc072937c6ed9db556ad2052a0e22d3223 b/data/database/69abbc2d699f79439743c57d2061155c8564bea973962e7593c436664e8521f3 similarity index 100% rename from data/database/698ef628ee4a4f5503719dd446a418bc072937c6ed9db556ad2052a0e22d3223 rename to data/database/69abbc2d699f79439743c57d2061155c8564bea973962e7593c436664e8521f3 diff --git a/data/database/6b08f96bda27610dc435dd34c48c62541b0bb0a9ce9907281749cc9523a2842a b/data/database/6b08f96bda27610dc435dd34c48c62541b0bb0a9ce9907281749cc9523a2842a deleted file mode 100644 index dc0df1d753b3..000000000000 Binary files a/data/database/6b08f96bda27610dc435dd34c48c62541b0bb0a9ce9907281749cc9523a2842a and /dev/null differ diff --git a/data/database/6b6058fe97505bdc462cd1577e7985b4b8887975c13f80b2fbfa7c21cfb05a9b b/data/database/6b6058fe97505bdc462cd1577e7985b4b8887975c13f80b2fbfa7c21cfb05a9b deleted file mode 100644 index 7af2194fd546..000000000000 Binary files a/data/database/6b6058fe97505bdc462cd1577e7985b4b8887975c13f80b2fbfa7c21cfb05a9b and /dev/null differ diff --git a/data/database/c31bc17e41889d69af13976dee974ea2654ae96d6c200646387f9e43ef94ef7d b/data/database/6b7e5bd7309a00555f129ab323acf14044dc039490936cd88dc2561b91bbfd2c similarity index 100% rename from data/database/c31bc17e41889d69af13976dee974ea2654ae96d6c200646387f9e43ef94ef7d rename to data/database/6b7e5bd7309a00555f129ab323acf14044dc039490936cd88dc2561b91bbfd2c diff --git a/data/database/76afec1103ed1471eab496761c14f5a4c8feb817ccaa76da14b88e862f343bc1 b/data/database/6bd40d3d4cd2b802cc2a37db304db99b84c836671f55d02a765e6c53948499f8 similarity index 100% rename from data/database/76afec1103ed1471eab496761c14f5a4c8feb817ccaa76da14b88e862f343bc1 rename to data/database/6bd40d3d4cd2b802cc2a37db304db99b84c836671f55d02a765e6c53948499f8 diff --git a/data/database/6e2893f047a64341a8aac726e8b0ab538304acb72a9bbfc247ef98fce0df7997 b/data/database/6e2893f047a64341a8aac726e8b0ab538304acb72a9bbfc247ef98fce0df7997 deleted file mode 100644 index 2f0244e79a61..000000000000 Binary files a/data/database/6e2893f047a64341a8aac726e8b0ab538304acb72a9bbfc247ef98fce0df7997 and /dev/null differ diff --git a/data/database/6e743367ba0bdc50ab4614913866261b641f9c046a0898e2fcc0607380c02936 b/data/database/6e743367ba0bdc50ab4614913866261b641f9c046a0898e2fcc0607380c02936 deleted file mode 100644 index 95172219a06c..000000000000 Binary files a/data/database/6e743367ba0bdc50ab4614913866261b641f9c046a0898e2fcc0607380c02936 and /dev/null differ diff --git a/data/database/6f2d9577dbe8f654cd42063cfccd80f3efb3e59a34422e5cb70b5ac7fa984034 b/data/database/6f2d9577dbe8f654cd42063cfccd80f3efb3e59a34422e5cb70b5ac7fa984034 deleted file mode 100644 index fc2c7a573bc2..000000000000 Binary files a/data/database/6f2d9577dbe8f654cd42063cfccd80f3efb3e59a34422e5cb70b5ac7fa984034 and /dev/null differ diff --git a/data/database/6f91b13e360c0a74454196bf51c68f5344d22ca3d2539a755b03ab86305493c6 b/data/database/6f91b13e360c0a74454196bf51c68f5344d22ca3d2539a755b03ab86305493c6 deleted file mode 100644 index c372e9b3bb83..000000000000 Binary files a/data/database/6f91b13e360c0a74454196bf51c68f5344d22ca3d2539a755b03ab86305493c6 and /dev/null differ diff --git a/data/database/71292532e42531597ce68e0444b56888528418d5eb5dc5ea2f2f5d6328537b6f b/data/database/71292532e42531597ce68e0444b56888528418d5eb5dc5ea2f2f5d6328537b6f deleted file mode 100644 index 6e7fa40e4f67..000000000000 Binary files a/data/database/71292532e42531597ce68e0444b56888528418d5eb5dc5ea2f2f5d6328537b6f and /dev/null differ diff --git a/data/database/14f9580ddc399e5d97ddd6da73d45c442564ca71b4f4ba9a98ee4b1640e5c80e b/data/database/7174b1c71b5c356c5b60480e68fede8b93992bba11f2c389a8a23d76cfd3e777 similarity index 100% rename from data/database/14f9580ddc399e5d97ddd6da73d45c442564ca71b4f4ba9a98ee4b1640e5c80e rename to data/database/7174b1c71b5c356c5b60480e68fede8b93992bba11f2c389a8a23d76cfd3e777 diff --git a/data/database/6194d20e298944d7ae1a357437f7269ec3b7fa009412733bbe6d291ca7f30e8c b/data/database/718f8f3a28a3de6f135f55bc84614407085a4b343f698331a3c99db792125812 similarity index 100% rename from data/database/6194d20e298944d7ae1a357437f7269ec3b7fa009412733bbe6d291ca7f30e8c rename to data/database/718f8f3a28a3de6f135f55bc84614407085a4b343f698331a3c99db792125812 diff --git a/data/database/fc077789f3b10ae90280252814289ec5804f535c4f5fdd55d8d0293c4e81524b b/data/database/71f475ef8d53ebeaf5ac0db560dccc47c944aae17321a9f00fc5bf0e9cd17da5 similarity index 100% rename from data/database/fc077789f3b10ae90280252814289ec5804f535c4f5fdd55d8d0293c4e81524b rename to data/database/71f475ef8d53ebeaf5ac0db560dccc47c944aae17321a9f00fc5bf0e9cd17da5 diff --git a/data/database/75ce0ce011d2a3eefafd9aeed5b9bb82658c3844116b3bb7089251d1d894d9f6 b/data/database/72962fe415cb37df2f25b22a1c5047f104005176e8ab24d9a57579e3aa61f011 similarity index 100% rename from data/database/75ce0ce011d2a3eefafd9aeed5b9bb82658c3844116b3bb7089251d1d894d9f6 rename to data/database/72962fe415cb37df2f25b22a1c5047f104005176e8ab24d9a57579e3aa61f011 diff --git a/data/database/744db703ae50aa48edcebf6a772d154a47a8daff12bf54b65691aed244f21d2a b/data/database/744db703ae50aa48edcebf6a772d154a47a8daff12bf54b65691aed244f21d2a deleted file mode 100644 index 8455f183990e..000000000000 Binary files a/data/database/744db703ae50aa48edcebf6a772d154a47a8daff12bf54b65691aed244f21d2a and /dev/null differ diff --git a/data/database/538a9704b60f1f0e8d62c753543f2a414175c7538c1a466860fe4067d3194c97 b/data/database/74c028560b4d13db6718fec35a323dbfd2cfb739247d374cb5211c71140d55ba similarity index 100% rename from data/database/538a9704b60f1f0e8d62c753543f2a414175c7538c1a466860fe4067d3194c97 rename to data/database/74c028560b4d13db6718fec35a323dbfd2cfb739247d374cb5211c71140d55ba diff --git a/data/database/7756a9f643fd6e77dc34d1037de7b19997ca8236a5fc33081e2c07152e1e6efb b/data/database/7756a9f643fd6e77dc34d1037de7b19997ca8236a5fc33081e2c07152e1e6efb deleted file mode 100644 index dbdd4a98aa4c..000000000000 Binary files a/data/database/7756a9f643fd6e77dc34d1037de7b19997ca8236a5fc33081e2c07152e1e6efb and /dev/null differ diff --git a/data/database/777913829eb0af8f02214e8555a8dac8d8ac49026f60907771844b9236a9aad2 b/data/database/777913829eb0af8f02214e8555a8dac8d8ac49026f60907771844b9236a9aad2 deleted file mode 100644 index 507771a2a887..000000000000 Binary files a/data/database/777913829eb0af8f02214e8555a8dac8d8ac49026f60907771844b9236a9aad2 and /dev/null differ diff --git a/data/database/77e20c3a8a520046c0502d6129a8a95832810ef3fc03d15c461b5a4da2e5be7e b/data/database/77e20c3a8a520046c0502d6129a8a95832810ef3fc03d15c461b5a4da2e5be7e deleted file mode 100644 index a6cecf7258a7..000000000000 Binary files a/data/database/77e20c3a8a520046c0502d6129a8a95832810ef3fc03d15c461b5a4da2e5be7e and /dev/null differ diff --git a/data/database/9cd7224f52da931b75fa626538a9adca455da1cb283b9710f31b5895c11f63a1 b/data/database/77f92d3c307caa1090878a8890da123a6a307ba4cb8e6e23b736c222e4a1675b similarity index 100% rename from data/database/9cd7224f52da931b75fa626538a9adca455da1cb283b9710f31b5895c11f63a1 rename to data/database/77f92d3c307caa1090878a8890da123a6a307ba4cb8e6e23b736c222e4a1675b diff --git a/data/database/77fb43f04b03892e70ec1dcaf67f26e997ecd90b92e6781a13b3cab81cb4f39a b/data/database/77fb43f04b03892e70ec1dcaf67f26e997ecd90b92e6781a13b3cab81cb4f39a deleted file mode 100644 index 1eaea29db912..000000000000 Binary files a/data/database/77fb43f04b03892e70ec1dcaf67f26e997ecd90b92e6781a13b3cab81cb4f39a and /dev/null differ diff --git a/data/database/16e12a5ce19567e79c7600b80886e587b1e7ea711ec70e734f324dbaf8c6bec1 b/data/database/79f9c6f4bf1ab489d52942198d3bbf2a324a5f8cd80e50fe39421f789630ea87 similarity index 100% rename from data/database/16e12a5ce19567e79c7600b80886e587b1e7ea711ec70e734f324dbaf8c6bec1 rename to data/database/79f9c6f4bf1ab489d52942198d3bbf2a324a5f8cd80e50fe39421f789630ea87 diff --git a/data/database/1c27141935bc99c201ae686d27bf4b144f1589d70ea8c02117832c44e141f65b b/data/database/7a80c125f7ee7a7793964a58c6079d8d5be76f74958e96cc0d77f652a4cb0b90 similarity index 100% rename from data/database/1c27141935bc99c201ae686d27bf4b144f1589d70ea8c02117832c44e141f65b rename to data/database/7a80c125f7ee7a7793964a58c6079d8d5be76f74958e96cc0d77f652a4cb0b90 diff --git a/data/database/7f5bff6fd41fae929aa21a2e6e554c985eddf275aa755dce582073d89b23f90a b/data/database/7b468972e74fa96acee460cdf2685620c4a0fce7222e12ea29a6c63410dcbb1b similarity index 100% rename from data/database/7f5bff6fd41fae929aa21a2e6e554c985eddf275aa755dce582073d89b23f90a rename to data/database/7b468972e74fa96acee460cdf2685620c4a0fce7222e12ea29a6c63410dcbb1b diff --git a/data/database/b22b43268d72ad2145259a6391691855abe87dee1bc4b02c6f22b51f979e951c b/data/database/7bfeabbc72e0df58ff85eab40ceaf62b293373ce6a0d302a7a03f48650c284a8 similarity index 100% rename from data/database/b22b43268d72ad2145259a6391691855abe87dee1bc4b02c6f22b51f979e951c rename to data/database/7bfeabbc72e0df58ff85eab40ceaf62b293373ce6a0d302a7a03f48650c284a8 diff --git a/data/database/0d428e7dd56282c285e1755ff03be3ebca6cb8d0c8632ec27385367334178704 b/data/database/7c17f6f7c9f95a1dbf0ff9aa525a0460e9a514ad98d04b1d839d9846a1012540 similarity index 100% rename from data/database/0d428e7dd56282c285e1755ff03be3ebca6cb8d0c8632ec27385367334178704 rename to data/database/7c17f6f7c9f95a1dbf0ff9aa525a0460e9a514ad98d04b1d839d9846a1012540 diff --git a/data/database/7cbbc126d4d6c06304676221447f15b147d0a479897b636b9cd7aff97301606e b/data/database/7cbbc126d4d6c06304676221447f15b147d0a479897b636b9cd7aff97301606e deleted file mode 100644 index 6d3ae46e3016..000000000000 Binary files a/data/database/7cbbc126d4d6c06304676221447f15b147d0a479897b636b9cd7aff97301606e and /dev/null differ diff --git a/data/database/8e56e90e6b84c089323c338fcb4a166b07e8af350bfa00c1bfa7bf7e937a6101 b/data/database/7d3446d9120267e23489ec573c869a342219cf756b0332a656285bdeb0efc208 similarity index 100% rename from data/database/8e56e90e6b84c089323c338fcb4a166b07e8af350bfa00c1bfa7bf7e937a6101 rename to data/database/7d3446d9120267e23489ec573c869a342219cf756b0332a656285bdeb0efc208 diff --git a/data/database/7f238940020aa10daab86516faa6ca525a811db66b93593455d510385e7b70e0 b/data/database/7f238940020aa10daab86516faa6ca525a811db66b93593455d510385e7b70e0 new file mode 100644 index 000000000000..fb9240915ad9 Binary files /dev/null and b/data/database/7f238940020aa10daab86516faa6ca525a811db66b93593455d510385e7b70e0 differ diff --git a/data/database/7fa6fb3fc6edf32cd0fa7edc1ac32f9ba0ad1590295764f90c5f11ea25798a28 b/data/database/7fa6fb3fc6edf32cd0fa7edc1ac32f9ba0ad1590295764f90c5f11ea25798a28 deleted file mode 100644 index a3baa3bb4789..000000000000 Binary files a/data/database/7fa6fb3fc6edf32cd0fa7edc1ac32f9ba0ad1590295764f90c5f11ea25798a28 and /dev/null differ diff --git a/data/database/aeb7c856ba27a27aace738aff7ffe56deae19a6370cbeabb0ae9821df9dd789e b/data/database/8034d46eaa85957feb9b3c4c5ff6405dad1f5272aece8517f39c626428fd6086 similarity index 100% rename from data/database/aeb7c856ba27a27aace738aff7ffe56deae19a6370cbeabb0ae9821df9dd789e rename to data/database/8034d46eaa85957feb9b3c4c5ff6405dad1f5272aece8517f39c626428fd6086 diff --git a/data/database/e808f84337d13936807f64098305a9a997433b69b992d366ebba87b5f63c7417 b/data/database/804148a8e314a1402643dcfbc03725164fe387e2f0fb01f1664f330484ad183f similarity index 100% rename from data/database/e808f84337d13936807f64098305a9a997433b69b992d366ebba87b5f63c7417 rename to data/database/804148a8e314a1402643dcfbc03725164fe387e2f0fb01f1664f330484ad183f diff --git a/data/database/83d228c41ef2556294605285abaeb02f98e96568177bb3ad27a558e5be914e80 b/data/database/808c9b1ff072ac93783e690f28711320e064137b9ce82cebd6f4c014d150fc1f similarity index 100% rename from data/database/83d228c41ef2556294605285abaeb02f98e96568177bb3ad27a558e5be914e80 rename to data/database/808c9b1ff072ac93783e690f28711320e064137b9ce82cebd6f4c014d150fc1f diff --git a/data/database/817cceb9d5cdbfc01b3ba79cb9f6aa168ee488aafd13b7513bd9130788463c19 b/data/database/817cceb9d5cdbfc01b3ba79cb9f6aa168ee488aafd13b7513bd9130788463c19 deleted file mode 100644 index 52112c4165c6..000000000000 Binary files a/data/database/817cceb9d5cdbfc01b3ba79cb9f6aa168ee488aafd13b7513bd9130788463c19 and /dev/null differ diff --git a/data/database/aff1e6b6b74aa45e268e3904ae3a5fbadd44905caf6dd69ea2fdf9ca8179685d b/data/database/827a52e011397bbd665babd8cb4539da792d410705d7b06828e82269754bb689 similarity index 99% rename from data/database/aff1e6b6b74aa45e268e3904ae3a5fbadd44905caf6dd69ea2fdf9ca8179685d rename to data/database/827a52e011397bbd665babd8cb4539da792d410705d7b06828e82269754bb689 index 8f9d9fc2f3b5..84814b64feac 100644 Binary files a/data/database/aff1e6b6b74aa45e268e3904ae3a5fbadd44905caf6dd69ea2fdf9ca8179685d and b/data/database/827a52e011397bbd665babd8cb4539da792d410705d7b06828e82269754bb689 differ diff --git a/data/database/8346cce1a6fca08c64d11f97e791d571caf01332a865f1ec62a981a783046124 b/data/database/8346cce1a6fca08c64d11f97e791d571caf01332a865f1ec62a981a783046124 deleted file mode 100644 index 4c13fbb7d987..000000000000 Binary files a/data/database/8346cce1a6fca08c64d11f97e791d571caf01332a865f1ec62a981a783046124 and /dev/null differ diff --git a/data/database/36bc44997dc76c1d5a5069a33427fdf018f2df1f45fbf39dcf48c5e22ab5d00c b/data/database/841d63c0a107fe558d32f442362cf0f8d6afe8e3e49a16595a5f7c0c54fabb18 similarity index 100% rename from data/database/36bc44997dc76c1d5a5069a33427fdf018f2df1f45fbf39dcf48c5e22ab5d00c rename to data/database/841d63c0a107fe558d32f442362cf0f8d6afe8e3e49a16595a5f7c0c54fabb18 diff --git a/data/database/2337e63f4a991586be6b7de91426ec3db1fc81d1d5d0c625115b4cc1245d612e b/data/database/8526ac2b7e0d0fc8d4862d7130c66385886de7af4b6af64d0856d89d92d2ae5e similarity index 100% rename from data/database/2337e63f4a991586be6b7de91426ec3db1fc81d1d5d0c625115b4cc1245d612e rename to data/database/8526ac2b7e0d0fc8d4862d7130c66385886de7af4b6af64d0856d89d92d2ae5e diff --git a/data/database/82a4be5882afb6d554d8fce631dce0bd0774329535aa59a04245bd93f3eaa415 b/data/database/871fc9d21b027641e3ff336ab62c6ed697d99aa9117b28f47e58f2981c23d40f similarity index 100% rename from data/database/82a4be5882afb6d554d8fce631dce0bd0774329535aa59a04245bd93f3eaa415 rename to data/database/871fc9d21b027641e3ff336ab62c6ed697d99aa9117b28f47e58f2981c23d40f diff --git a/data/database/877fdeed1adb174620d54dc8b834c4e3b2b5f444f102259195ae045f535a494c b/data/database/877fdeed1adb174620d54dc8b834c4e3b2b5f444f102259195ae045f535a494c deleted file mode 100644 index 6be710da4ae9..000000000000 Binary files a/data/database/877fdeed1adb174620d54dc8b834c4e3b2b5f444f102259195ae045f535a494c and /dev/null differ diff --git a/data/database/8833e527da0ad52f79c20febe8fc825652b952510622a476422e3afefeff8311 b/data/database/8833e527da0ad52f79c20febe8fc825652b952510622a476422e3afefeff8311 deleted file mode 100644 index 670f9f031a94..000000000000 Binary files a/data/database/8833e527da0ad52f79c20febe8fc825652b952510622a476422e3afefeff8311 and /dev/null differ diff --git a/data/database/884e57123963802b7197190f6559a6543d970dc7acef07a0b71d478a5e9c7b5a b/data/database/884e57123963802b7197190f6559a6543d970dc7acef07a0b71d478a5e9c7b5a deleted file mode 100644 index 254b576e1ae2..000000000000 Binary files a/data/database/884e57123963802b7197190f6559a6543d970dc7acef07a0b71d478a5e9c7b5a and /dev/null differ diff --git a/data/database/dbb87f7de4a711ebec12ef9545f5af9a757c7c9fd16e5ae202097c647c4f3abf b/data/database/88679985976c2895059ef7692664f335c3eba11134048be8f981094929fdbe68 similarity index 100% rename from data/database/dbb87f7de4a711ebec12ef9545f5af9a757c7c9fd16e5ae202097c647c4f3abf rename to data/database/88679985976c2895059ef7692664f335c3eba11134048be8f981094929fdbe68 diff --git a/data/database/89d4eac1d06616c8524e98eb633e1454e4a35283782a987715eab64bac1fb25a b/data/database/89d4eac1d06616c8524e98eb633e1454e4a35283782a987715eab64bac1fb25a deleted file mode 100644 index 5040bd844d49..000000000000 Binary files a/data/database/89d4eac1d06616c8524e98eb633e1454e4a35283782a987715eab64bac1fb25a and /dev/null differ diff --git a/data/database/cdce853bcf23b7a0222902b10d631e550a2cb4873ea92e0c85ad8ef578bdee68 b/data/database/8bb5314e8dd640c126e1adcbe4974614bb230fe18c36168e7d091d09ec74ad2b similarity index 100% rename from data/database/cdce853bcf23b7a0222902b10d631e550a2cb4873ea92e0c85ad8ef578bdee68 rename to data/database/8bb5314e8dd640c126e1adcbe4974614bb230fe18c36168e7d091d09ec74ad2b diff --git a/data/database/8c1965cfaf1789b71309d2b2d5c6ef7614afc83eb740e02466753885206a1673 b/data/database/8c1965cfaf1789b71309d2b2d5c6ef7614afc83eb740e02466753885206a1673 deleted file mode 100644 index 93f9035683fd..000000000000 Binary files a/data/database/8c1965cfaf1789b71309d2b2d5c6ef7614afc83eb740e02466753885206a1673 and /dev/null differ diff --git a/data/database/8c219684bffc8e40b0f0ddc14f755f21698a5c66df8b80c66be5fa480cdc5467 b/data/database/8c219684bffc8e40b0f0ddc14f755f21698a5c66df8b80c66be5fa480cdc5467 deleted file mode 100644 index 8bad0af7ee9c..000000000000 Binary files a/data/database/8c219684bffc8e40b0f0ddc14f755f21698a5c66df8b80c66be5fa480cdc5467 and /dev/null differ diff --git a/data/database/8e035c9e7f425e6b58be49ec12955c7420458805fa71aa52c17a6d3f80cdc937 b/data/database/8e035c9e7f425e6b58be49ec12955c7420458805fa71aa52c17a6d3f80cdc937 deleted file mode 100644 index 1120ad387cfb..000000000000 Binary files a/data/database/8e035c9e7f425e6b58be49ec12955c7420458805fa71aa52c17a6d3f80cdc937 and /dev/null differ diff --git a/data/database/8e23821fe75f8c5b7fab610876c61e38f3feb6679119c4625d1c06df28e711c5 b/data/database/8e23821fe75f8c5b7fab610876c61e38f3feb6679119c4625d1c06df28e711c5 deleted file mode 100644 index 74a516e1ba6c..000000000000 Binary files a/data/database/8e23821fe75f8c5b7fab610876c61e38f3feb6679119c4625d1c06df28e711c5 and /dev/null differ diff --git a/data/database/d41ee9d550e25169a2a9869741dc12ccecd3d3d380afff90b09393161e0799b3 b/data/database/90082834436545317276b0de97c8d2fbfaea4501ddb8f4e5b78de9794eee105b similarity index 99% rename from data/database/d41ee9d550e25169a2a9869741dc12ccecd3d3d380afff90b09393161e0799b3 rename to data/database/90082834436545317276b0de97c8d2fbfaea4501ddb8f4e5b78de9794eee105b index 735cc9fe97a9..70b2e64d59ef 100644 Binary files a/data/database/d41ee9d550e25169a2a9869741dc12ccecd3d3d380afff90b09393161e0799b3 and b/data/database/90082834436545317276b0de97c8d2fbfaea4501ddb8f4e5b78de9794eee105b differ diff --git a/data/database/15afd0a1aed2395980c847944c34fb3d2700b3ae3ec9e466b347f831649d0088 b/data/database/9050dcdaf4dc6c2deff625e262a0ef7362057e1a836208a0e5b129970da1190f similarity index 100% rename from data/database/15afd0a1aed2395980c847944c34fb3d2700b3ae3ec9e466b347f831649d0088 rename to data/database/9050dcdaf4dc6c2deff625e262a0ef7362057e1a836208a0e5b129970da1190f diff --git a/data/database/3c038e15d3832a50572e2e6f4e139854a5eeb82c492713e4928871cc9bb53e42 b/data/database/90958659c301acc839154bf7ccb66fb8537a4ab22bce253a250eade2f4c9bd89 similarity index 94% rename from data/database/3c038e15d3832a50572e2e6f4e139854a5eeb82c492713e4928871cc9bb53e42 rename to data/database/90958659c301acc839154bf7ccb66fb8537a4ab22bce253a250eade2f4c9bd89 index 448cb91e2d73..aa7fadb0b8f3 100644 Binary files a/data/database/3c038e15d3832a50572e2e6f4e139854a5eeb82c492713e4928871cc9bb53e42 and b/data/database/90958659c301acc839154bf7ccb66fb8537a4ab22bce253a250eade2f4c9bd89 differ diff --git a/data/database/ee1c55187d6bae929bd4b8c0a46e30d16e3732340342b89e486720cdeb392163 b/data/database/920f8eca27fd28c45f753c741ce930e147bf7e80bf2b92c089076b4f6d2fb8cc similarity index 100% rename from data/database/ee1c55187d6bae929bd4b8c0a46e30d16e3732340342b89e486720cdeb392163 rename to data/database/920f8eca27fd28c45f753c741ce930e147bf7e80bf2b92c089076b4f6d2fb8cc diff --git a/data/database/96fe617ec28eb2ad84ec45141aa2578b5b75bf6c1d2d3ace93103b15b737319e b/data/database/96fe617ec28eb2ad84ec45141aa2578b5b75bf6c1d2d3ace93103b15b737319e deleted file mode 100644 index 9ed2dd966f5c..000000000000 Binary files a/data/database/96fe617ec28eb2ad84ec45141aa2578b5b75bf6c1d2d3ace93103b15b737319e and /dev/null differ diff --git a/data/database/62ebd1a765482bc94ff283e8a2e7e00a2861f89ac38d6910b53edddd82b30cd5 b/data/database/97e7d8baa4efa647eafac3b1f08573e11f88d8ae649c4bbc9e9bfe21a6eeb027 similarity index 93% rename from data/database/62ebd1a765482bc94ff283e8a2e7e00a2861f89ac38d6910b53edddd82b30cd5 rename to data/database/97e7d8baa4efa647eafac3b1f08573e11f88d8ae649c4bbc9e9bfe21a6eeb027 index 3c3c9bfd4160..1ceb5e8ad347 100644 Binary files a/data/database/62ebd1a765482bc94ff283e8a2e7e00a2861f89ac38d6910b53edddd82b30cd5 and b/data/database/97e7d8baa4efa647eafac3b1f08573e11f88d8ae649c4bbc9e9bfe21a6eeb027 differ diff --git a/data/database/97ee18283692de2e3f5e1aa9bb2e660aa65056c7fa4e84b4f23cf37bbe43c5f3 b/data/database/97ee18283692de2e3f5e1aa9bb2e660aa65056c7fa4e84b4f23cf37bbe43c5f3 deleted file mode 100644 index 68ac4b05216b..000000000000 Binary files a/data/database/97ee18283692de2e3f5e1aa9bb2e660aa65056c7fa4e84b4f23cf37bbe43c5f3 and /dev/null differ diff --git a/data/database/9839962a24a86c01673e6d8da3e37d303189834c7c8c5d6fa29f15c1ac47c02e b/data/database/9839962a24a86c01673e6d8da3e37d303189834c7c8c5d6fa29f15c1ac47c02e deleted file mode 100644 index 639eca85ff7a..000000000000 Binary files a/data/database/9839962a24a86c01673e6d8da3e37d303189834c7c8c5d6fa29f15c1ac47c02e and /dev/null differ diff --git a/data/database/024b676a81f71c3193b8fa6367501ea4326ec3457035b259489159b19a44972b b/data/database/990b4a60802c8e0449e2fb7d3a8535624ad5cd4277c6dd34b5bd5dd1d0463396 similarity index 100% rename from data/database/024b676a81f71c3193b8fa6367501ea4326ec3457035b259489159b19a44972b rename to data/database/990b4a60802c8e0449e2fb7d3a8535624ad5cd4277c6dd34b5bd5dd1d0463396 diff --git a/data/database/9a0389ec8937dbdf2ee72d6a858c10b6b11462940ac3a12275d61bee9fa93415 b/data/database/9a0389ec8937dbdf2ee72d6a858c10b6b11462940ac3a12275d61bee9fa93415 deleted file mode 100644 index 51c54ca02a10..000000000000 Binary files a/data/database/9a0389ec8937dbdf2ee72d6a858c10b6b11462940ac3a12275d61bee9fa93415 and /dev/null differ diff --git a/data/database/92c0c7f5648bd9b4aed319c3bfeab576f775895aaceb418a232e92c36324f414 b/data/database/9a1f9ff2e3bc42e8d97c884aaf63dba1d09291b3263f112e81beb57757a5f9bc similarity index 100% rename from data/database/92c0c7f5648bd9b4aed319c3bfeab576f775895aaceb418a232e92c36324f414 rename to data/database/9a1f9ff2e3bc42e8d97c884aaf63dba1d09291b3263f112e81beb57757a5f9bc diff --git a/data/database/9a59e5f6fdd07555c55d4de4b5cc3e8f633cc63c446ae45c53e2e1308d168c7c b/data/database/9a59e5f6fdd07555c55d4de4b5cc3e8f633cc63c446ae45c53e2e1308d168c7c deleted file mode 100644 index 9cd941f6c388..000000000000 Binary files a/data/database/9a59e5f6fdd07555c55d4de4b5cc3e8f633cc63c446ae45c53e2e1308d168c7c and /dev/null differ diff --git a/data/database/9c445ce52f9c9b1d54b85c2a5c3ef5665499030d60bf5cbde9ede1a81a7804aa b/data/database/9c445ce52f9c9b1d54b85c2a5c3ef5665499030d60bf5cbde9ede1a81a7804aa deleted file mode 100644 index 03a9ac6b02bd..000000000000 Binary files a/data/database/9c445ce52f9c9b1d54b85c2a5c3ef5665499030d60bf5cbde9ede1a81a7804aa and /dev/null differ diff --git a/data/database/9c93003484e688ba08103456f8c2eebdf9d2c037d5c20414a2564b7cfb921e7f b/data/database/9c93003484e688ba08103456f8c2eebdf9d2c037d5c20414a2564b7cfb921e7f deleted file mode 100644 index 68de5fdacbde..000000000000 Binary files a/data/database/9c93003484e688ba08103456f8c2eebdf9d2c037d5c20414a2564b7cfb921e7f and /dev/null differ diff --git a/data/database/9dcf3dcb40c128ec52f61aaea23fb72c4419f439f07855fd148e7baa88d98360 b/data/database/9dcf3dcb40c128ec52f61aaea23fb72c4419f439f07855fd148e7baa88d98360 deleted file mode 100644 index 35c67440ace5..000000000000 Binary files a/data/database/9dcf3dcb40c128ec52f61aaea23fb72c4419f439f07855fd148e7baa88d98360 and /dev/null differ diff --git a/data/database/9e103e9be3f57ba184de248860eea8e811b9544a34253a7a0499104f95000462 b/data/database/9e103e9be3f57ba184de248860eea8e811b9544a34253a7a0499104f95000462 deleted file mode 100644 index dc8add11383e..000000000000 Binary files a/data/database/9e103e9be3f57ba184de248860eea8e811b9544a34253a7a0499104f95000462 and /dev/null differ diff --git a/data/database/9e63a9f2c901f599f8dff641ac04420c5b074b9f7250bdfdaccee0baf3902845 b/data/database/9e63a9f2c901f599f8dff641ac04420c5b074b9f7250bdfdaccee0baf3902845 deleted file mode 100644 index dc69b0742e9b..000000000000 Binary files a/data/database/9e63a9f2c901f599f8dff641ac04420c5b074b9f7250bdfdaccee0baf3902845 and /dev/null differ diff --git a/data/database/a2580f6f8064ad70f4b5c69c8ea264fc50b3f512aa93757e21d25ee634e8e614 b/data/database/a2580f6f8064ad70f4b5c69c8ea264fc50b3f512aa93757e21d25ee634e8e614 deleted file mode 100644 index 411f33d33195..000000000000 Binary files a/data/database/a2580f6f8064ad70f4b5c69c8ea264fc50b3f512aa93757e21d25ee634e8e614 and /dev/null differ diff --git a/data/database/3a4543ca6f5bc554a43c9c1bd7f3046aed2d3556040a5d6ccd22ab1e03433775 b/data/database/a33109772e93cffae9f23c2c49100044b980a788106bccb491cf472e095093b8 similarity index 99% rename from data/database/3a4543ca6f5bc554a43c9c1bd7f3046aed2d3556040a5d6ccd22ab1e03433775 rename to data/database/a33109772e93cffae9f23c2c49100044b980a788106bccb491cf472e095093b8 index 16015c4aed90..01c752ccd7fc 100644 Binary files a/data/database/3a4543ca6f5bc554a43c9c1bd7f3046aed2d3556040a5d6ccd22ab1e03433775 and b/data/database/a33109772e93cffae9f23c2c49100044b980a788106bccb491cf472e095093b8 differ diff --git a/data/database/042ea8421e7b3bfdd2d31b6aecaf2f8dce9bee9ccd32289cdfe5a225a4b6ccce b/data/database/a38a8e15bcf331ea7bba61d2d2adb4b5d586f6aa9e9b0d56694039e8b6b10039 similarity index 99% rename from data/database/042ea8421e7b3bfdd2d31b6aecaf2f8dce9bee9ccd32289cdfe5a225a4b6ccce rename to data/database/a38a8e15bcf331ea7bba61d2d2adb4b5d586f6aa9e9b0d56694039e8b6b10039 index b0e3f35ba26d..453c3ae8d921 100644 Binary files a/data/database/042ea8421e7b3bfdd2d31b6aecaf2f8dce9bee9ccd32289cdfe5a225a4b6ccce and b/data/database/a38a8e15bcf331ea7bba61d2d2adb4b5d586f6aa9e9b0d56694039e8b6b10039 differ diff --git a/data/database/a4f3b5aefcdda815ff477626d6d65d55f5704027f1c28a540126d0852256c632 b/data/database/a4f3b5aefcdda815ff477626d6d65d55f5704027f1c28a540126d0852256c632 deleted file mode 100644 index 1ea340eaa58c..000000000000 Binary files a/data/database/a4f3b5aefcdda815ff477626d6d65d55f5704027f1c28a540126d0852256c632 and /dev/null differ diff --git a/data/database/a4f5e10b4d0112366a42848e20aec36a1754e4ba7cfc392715bc35b2a428f0f0 b/data/database/a4f5e10b4d0112366a42848e20aec36a1754e4ba7cfc392715bc35b2a428f0f0 deleted file mode 100644 index f83b861e2fbf..000000000000 Binary files a/data/database/a4f5e10b4d0112366a42848e20aec36a1754e4ba7cfc392715bc35b2a428f0f0 and /dev/null differ diff --git a/data/database/a532dbf12d6bc6c7b0d783a2c2cd6dbb86c3dcebf10375cd3bcd26dd8b3ba308 b/data/database/a532dbf12d6bc6c7b0d783a2c2cd6dbb86c3dcebf10375cd3bcd26dd8b3ba308 deleted file mode 100644 index e7583d608854..000000000000 Binary files a/data/database/a532dbf12d6bc6c7b0d783a2c2cd6dbb86c3dcebf10375cd3bcd26dd8b3ba308 and /dev/null differ diff --git a/data/database/a5c94cf2467a5c075af48a35d2512362389f0fe13ae65f36963607d6c8ba0031 b/data/database/a5c94cf2467a5c075af48a35d2512362389f0fe13ae65f36963607d6c8ba0031 deleted file mode 100644 index 75f6b86f4031..000000000000 Binary files a/data/database/a5c94cf2467a5c075af48a35d2512362389f0fe13ae65f36963607d6c8ba0031 and /dev/null differ diff --git a/data/database/a656c5f8670b61f23eef207df2d7536f3ff9433849b725645b95ef6cc72be601 b/data/database/a656c5f8670b61f23eef207df2d7536f3ff9433849b725645b95ef6cc72be601 new file mode 100644 index 000000000000..ff2ba252637e Binary files /dev/null and b/data/database/a656c5f8670b61f23eef207df2d7536f3ff9433849b725645b95ef6cc72be601 differ diff --git a/data/database/a6627f283edcf50ba14c23fcc0f094708db93713fdc0772e7e88170ebc3029bc b/data/database/a6627f283edcf50ba14c23fcc0f094708db93713fdc0772e7e88170ebc3029bc deleted file mode 100644 index 11180a3b175c..000000000000 Binary files a/data/database/a6627f283edcf50ba14c23fcc0f094708db93713fdc0772e7e88170ebc3029bc and /dev/null differ diff --git a/data/database/a7c29dcaba5aee39d9dd77273bfaed426d6bb647459634a92af6695ab1aa4fb0 b/data/database/a7c29dcaba5aee39d9dd77273bfaed426d6bb647459634a92af6695ab1aa4fb0 deleted file mode 100644 index a9f9e2fbc6f5..000000000000 Binary files a/data/database/a7c29dcaba5aee39d9dd77273bfaed426d6bb647459634a92af6695ab1aa4fb0 and /dev/null differ diff --git a/data/database/a7d7f5751419893e297f6addf45b0505b48d1da49e939600e7a0c717eb5cd6a0 b/data/database/a7d7f5751419893e297f6addf45b0505b48d1da49e939600e7a0c717eb5cd6a0 deleted file mode 100644 index 6cd2740a5d2f..000000000000 Binary files a/data/database/a7d7f5751419893e297f6addf45b0505b48d1da49e939600e7a0c717eb5cd6a0 and /dev/null differ diff --git a/data/database/da3bf4ef2cdb26d95c621f63034279a51a3184ce8916db1dc11a7ac4ccc36d93 b/data/database/a9b52cabba349c3f336d895f8273b0b8e9a6fab8a78368534aee586daf99d01c similarity index 100% rename from data/database/da3bf4ef2cdb26d95c621f63034279a51a3184ce8916db1dc11a7ac4ccc36d93 rename to data/database/a9b52cabba349c3f336d895f8273b0b8e9a6fab8a78368534aee586daf99d01c diff --git a/data/database/a9d9e1e794f684e58b1aa3c99a908639ae635c22c20ac5f0c33a97b58c0a3547 b/data/database/a9d9e1e794f684e58b1aa3c99a908639ae635c22c20ac5f0c33a97b58c0a3547 deleted file mode 100644 index f6dffff3ecaa..000000000000 Binary files a/data/database/a9d9e1e794f684e58b1aa3c99a908639ae635c22c20ac5f0c33a97b58c0a3547 and /dev/null differ diff --git a/data/database/0fc8e58d6814d7fd3b987ce3f230bd5a8282532851dad2f1b5dfa97c5d134789 b/data/database/ab306813626964d53a6c4d3d84157b86dd2027a0453c2b94290e1d2e77d8bbf3 similarity index 100% rename from data/database/0fc8e58d6814d7fd3b987ce3f230bd5a8282532851dad2f1b5dfa97c5d134789 rename to data/database/ab306813626964d53a6c4d3d84157b86dd2027a0453c2b94290e1d2e77d8bbf3 diff --git a/data/database/ab5da16abe661a260c8876ba6caf963df9236436eabfa6f9267b3bcebd583f40 b/data/database/ab5da16abe661a260c8876ba6caf963df9236436eabfa6f9267b3bcebd583f40 deleted file mode 100644 index 25efaf320ab1..000000000000 Binary files a/data/database/ab5da16abe661a260c8876ba6caf963df9236436eabfa6f9267b3bcebd583f40 and /dev/null differ diff --git a/data/database/ab909c2fed41e215d68d7e591f8752316f6e97c37e2d0f37ffa88ab0c09be44c b/data/database/ab909c2fed41e215d68d7e591f8752316f6e97c37e2d0f37ffa88ab0c09be44c deleted file mode 100644 index ef5022cc326f..000000000000 Binary files a/data/database/ab909c2fed41e215d68d7e591f8752316f6e97c37e2d0f37ffa88ab0c09be44c and /dev/null differ diff --git a/data/database/5b628c27beefa18e666dc08efd17dd63d6a2c26576bf02995991f38d0e142eb7 b/data/database/ab99e0fc47c030c0d30f4af2570e5e924e871e0aac9c815d27483a5c6706d8ae similarity index 100% rename from data/database/5b628c27beefa18e666dc08efd17dd63d6a2c26576bf02995991f38d0e142eb7 rename to data/database/ab99e0fc47c030c0d30f4af2570e5e924e871e0aac9c815d27483a5c6706d8ae diff --git a/data/database/abdf4a9f385c5437390cff2e8345ed9e2ce2fc40b044619f3fc8c05950ff7b77 b/data/database/abdf4a9f385c5437390cff2e8345ed9e2ce2fc40b044619f3fc8c05950ff7b77 new file mode 100644 index 000000000000..66770dbdc1f2 Binary files /dev/null and b/data/database/abdf4a9f385c5437390cff2e8345ed9e2ce2fc40b044619f3fc8c05950ff7b77 differ diff --git a/data/database/ac10737d4078b8c3fa6a767059df2107c7637a87500235111fa4f3c800dbadc0 b/data/database/ac10737d4078b8c3fa6a767059df2107c7637a87500235111fa4f3c800dbadc0 deleted file mode 100644 index 59385e76d976..000000000000 Binary files a/data/database/ac10737d4078b8c3fa6a767059df2107c7637a87500235111fa4f3c800dbadc0 and /dev/null differ diff --git a/data/database/2767c0dc20b7588c76edca726441bfe1e6fd973d57d67ba8033479408b7feee0 b/data/database/ac71ec0fec6d7f46fe47c2750c39c8529122591f238a5faf7938a4a10aba8dd7 similarity index 100% rename from data/database/2767c0dc20b7588c76edca726441bfe1e6fd973d57d67ba8033479408b7feee0 rename to data/database/ac71ec0fec6d7f46fe47c2750c39c8529122591f238a5faf7938a4a10aba8dd7 diff --git a/data/database/05daa0fef2d0a5a694d2e7f9af07044452b57a0528ce98fd0c217c83cb7da11c b/data/database/af53882b7cac6c8a823e0ff7331395a7f28c0d237c2b1e4319de0e9de63ce480 similarity index 100% rename from data/database/05daa0fef2d0a5a694d2e7f9af07044452b57a0528ce98fd0c217c83cb7da11c rename to data/database/af53882b7cac6c8a823e0ff7331395a7f28c0d237c2b1e4319de0e9de63ce480 diff --git a/data/database/fb9cda23c1ed84c590febde6f07120d6e0b9778ab9f5b90f1d7119a8f5409f5f b/data/database/afdf77971f4619772b99ed237e9871cbfed08c9b22f67060919ae03dc9131c0d similarity index 100% rename from data/database/fb9cda23c1ed84c590febde6f07120d6e0b9778ab9f5b90f1d7119a8f5409f5f rename to data/database/afdf77971f4619772b99ed237e9871cbfed08c9b22f67060919ae03dc9131c0d diff --git a/data/database/30ccdf79892198eb404e2f313449ab707a3ff59a07cca029d80f22d08b26d41b b/data/database/aff77c2d8ffd31c3570924f1cb7e5637a59b1e01243d9b2ef4f699ce8647bdbe similarity index 100% rename from data/database/30ccdf79892198eb404e2f313449ab707a3ff59a07cca029d80f22d08b26d41b rename to data/database/aff77c2d8ffd31c3570924f1cb7e5637a59b1e01243d9b2ef4f699ce8647bdbe diff --git a/data/database/4dbaf6fdf039d4ffe944ec6bd1f13ed3d8f93d83f5fa48bcd75f7303d271dc5a b/data/database/b045491106212d9b390a5e7420c42ec5842b00118162e749749645c6cc3aa4cf similarity index 100% rename from data/database/4dbaf6fdf039d4ffe944ec6bd1f13ed3d8f93d83f5fa48bcd75f7303d271dc5a rename to data/database/b045491106212d9b390a5e7420c42ec5842b00118162e749749645c6cc3aa4cf diff --git a/data/database/b0becd66e6a05660e6817129df2d9337a8b89cd64062eaa20917d16d762c7272 b/data/database/b0becd66e6a05660e6817129df2d9337a8b89cd64062eaa20917d16d762c7272 deleted file mode 100644 index e203f5aa13b5..000000000000 Binary files a/data/database/b0becd66e6a05660e6817129df2d9337a8b89cd64062eaa20917d16d762c7272 and /dev/null differ diff --git a/data/database/16d456148b8020c6622deaea2fd347e148f0f1cae425635efe2655f757a76d67 b/data/database/b159528d6c5efc05d0767d28e846e3167c0ca17712dbad9394204f870ac6e921 similarity index 100% rename from data/database/16d456148b8020c6622deaea2fd347e148f0f1cae425635efe2655f757a76d67 rename to data/database/b159528d6c5efc05d0767d28e846e3167c0ca17712dbad9394204f870ac6e921 diff --git a/data/database/b222eac4a8ee802d66fd65b6a89644cab461c4c31d815bb48051ee167893671a b/data/database/b222eac4a8ee802d66fd65b6a89644cab461c4c31d815bb48051ee167893671a deleted file mode 100644 index 83e41aa8f6d5..000000000000 Binary files a/data/database/b222eac4a8ee802d66fd65b6a89644cab461c4c31d815bb48051ee167893671a and /dev/null differ diff --git a/data/database/b2867354103fb1a4e05c68de0b26ee9a22e3437ff0f58152a7c18d7128cf2dfb b/data/database/b2867354103fb1a4e05c68de0b26ee9a22e3437ff0f58152a7c18d7128cf2dfb deleted file mode 100644 index 33ed4703a66e..000000000000 Binary files a/data/database/b2867354103fb1a4e05c68de0b26ee9a22e3437ff0f58152a7c18d7128cf2dfb and /dev/null differ diff --git a/data/database/ae79b369628a92682f8f67718bebbc953b957c7fd3ed80558f6ac9aa60fe5337 b/data/database/b348739a7b52c0dacbe37045da04fa4a8ea983acc9b84b28e21c5b72615ba22a similarity index 66% rename from data/database/ae79b369628a92682f8f67718bebbc953b957c7fd3ed80558f6ac9aa60fe5337 rename to data/database/b348739a7b52c0dacbe37045da04fa4a8ea983acc9b84b28e21c5b72615ba22a index fa46ed79ff18..75ac93aefa27 100644 Binary files a/data/database/ae79b369628a92682f8f67718bebbc953b957c7fd3ed80558f6ac9aa60fe5337 and b/data/database/b348739a7b52c0dacbe37045da04fa4a8ea983acc9b84b28e21c5b72615ba22a differ diff --git a/data/database/b3d603cb2744aea83abba5ef18bbd05c5612d3d6e78b1bad877d6ce33a5dd95b b/data/database/b3d603cb2744aea83abba5ef18bbd05c5612d3d6e78b1bad877d6ce33a5dd95b deleted file mode 100644 index f2896809759b..000000000000 Binary files a/data/database/b3d603cb2744aea83abba5ef18bbd05c5612d3d6e78b1bad877d6ce33a5dd95b and /dev/null differ diff --git a/data/database/b6534c913a4fb54b01987f7ea6615671d9530b73b5d66040cad15e11ad18c48f b/data/database/b6534c913a4fb54b01987f7ea6615671d9530b73b5d66040cad15e11ad18c48f deleted file mode 100644 index 3f74872892ef..000000000000 Binary files a/data/database/b6534c913a4fb54b01987f7ea6615671d9530b73b5d66040cad15e11ad18c48f and /dev/null differ diff --git a/data/database/b76b34ed2d666cbbf1ef3f974b5b10a4bb4ae89dada15eb200844f7504931482 b/data/database/b76b34ed2d666cbbf1ef3f974b5b10a4bb4ae89dada15eb200844f7504931482 deleted file mode 100644 index 670f9f031a94..000000000000 Binary files a/data/database/b76b34ed2d666cbbf1ef3f974b5b10a4bb4ae89dada15eb200844f7504931482 and /dev/null differ diff --git a/data/database/b7d629b7e2cbe6d4f7bf1e0d41b51192dea0d2316d74e510318c53c51dec8551 b/data/database/b7d629b7e2cbe6d4f7bf1e0d41b51192dea0d2316d74e510318c53c51dec8551 deleted file mode 100644 index 4b44457c0079..000000000000 Binary files a/data/database/b7d629b7e2cbe6d4f7bf1e0d41b51192dea0d2316d74e510318c53c51dec8551 and /dev/null differ diff --git a/data/database/b8184206813dc43f93e8c8b0e773a91523fb5468a7209428e10e5e231d3146dd b/data/database/b8184206813dc43f93e8c8b0e773a91523fb5468a7209428e10e5e231d3146dd deleted file mode 100644 index bd1b2c2eb78e..000000000000 Binary files a/data/database/b8184206813dc43f93e8c8b0e773a91523fb5468a7209428e10e5e231d3146dd and /dev/null differ diff --git a/data/database/b81e101efcdb7a6d824763e47e4bb178351743361de45f097195a62b8a4b87b7 b/data/database/b81e101efcdb7a6d824763e47e4bb178351743361de45f097195a62b8a4b87b7 deleted file mode 100644 index 937652b303e9..000000000000 Binary files a/data/database/b81e101efcdb7a6d824763e47e4bb178351743361de45f097195a62b8a4b87b7 and /dev/null differ diff --git a/data/database/b8ae8fddbc3ec02fa10ff235a1971c8e77c96f0d42a24bda1ac59d5ac2b134f7 b/data/database/b8ae8fddbc3ec02fa10ff235a1971c8e77c96f0d42a24bda1ac59d5ac2b134f7 deleted file mode 100644 index e9c5e7d18283..000000000000 Binary files a/data/database/b8ae8fddbc3ec02fa10ff235a1971c8e77c96f0d42a24bda1ac59d5ac2b134f7 and /dev/null differ diff --git a/data/database/10bca5283f289461a823c5252bf9915305e66d2c615d2ce0be52303b790dcdb9 b/data/database/bb27ea51fcb41de1d8cdd7d79757cca052a5fe59acefc6482b5305cd4393a724 similarity index 100% rename from data/database/10bca5283f289461a823c5252bf9915305e66d2c615d2ce0be52303b790dcdb9 rename to data/database/bb27ea51fcb41de1d8cdd7d79757cca052a5fe59acefc6482b5305cd4393a724 diff --git a/data/database/c7933413bed7f5f22f19d7a0cc972ba1694916a7e91d7da9bc5ed304c6635222 b/data/database/bbc13fde8b5651cf139240fbf268c8a137c4330955a90ab80622a183e9e7f382 similarity index 100% rename from data/database/c7933413bed7f5f22f19d7a0cc972ba1694916a7e91d7da9bc5ed304c6635222 rename to data/database/bbc13fde8b5651cf139240fbf268c8a137c4330955a90ab80622a183e9e7f382 diff --git a/data/database/bc724f701ded82d7d653e42514365812d945b83d3be9227994a69bab7398548a b/data/database/bc724f701ded82d7d653e42514365812d945b83d3be9227994a69bab7398548a deleted file mode 100644 index 8d631c4b4421..000000000000 Binary files a/data/database/bc724f701ded82d7d653e42514365812d945b83d3be9227994a69bab7398548a and /dev/null differ diff --git a/data/database/bca326520593bd6f634101a5c097b50a9f3a7a5a8e444ce284c5e5d0d0f39147 b/data/database/bca326520593bd6f634101a5c097b50a9f3a7a5a8e444ce284c5e5d0d0f39147 deleted file mode 100644 index 7673c6a31bd7..000000000000 Binary files a/data/database/bca326520593bd6f634101a5c097b50a9f3a7a5a8e444ce284c5e5d0d0f39147 and /dev/null differ diff --git a/data/database/bd4d1de5df2bf55e01bf0d739ff4d04bc0f80fb5cf057a0d020b81e9a668ff8e b/data/database/bd4d1de5df2bf55e01bf0d739ff4d04bc0f80fb5cf057a0d020b81e9a668ff8e deleted file mode 100644 index 8d631c4b4421..000000000000 Binary files a/data/database/bd4d1de5df2bf55e01bf0d739ff4d04bc0f80fb5cf057a0d020b81e9a668ff8e and /dev/null differ diff --git a/data/database/50fc45b5075077a7f990b3b929af30f3dbed2ecda91a8e7e11444d89c304963b b/data/database/bd6484854db0e43117e8f5eb683397a64e9347a9b977339c1084fa8566823d9f similarity index 100% rename from data/database/50fc45b5075077a7f990b3b929af30f3dbed2ecda91a8e7e11444d89c304963b rename to data/database/bd6484854db0e43117e8f5eb683397a64e9347a9b977339c1084fa8566823d9f diff --git a/data/database/be16f898c27e85169f7926697ee605fa32f04758ca4500b0b78052624e5a5b5c b/data/database/be16f898c27e85169f7926697ee605fa32f04758ca4500b0b78052624e5a5b5c deleted file mode 100644 index 14f1aafe67cd..000000000000 Binary files a/data/database/be16f898c27e85169f7926697ee605fa32f04758ca4500b0b78052624e5a5b5c and /dev/null differ diff --git a/data/database/be57353616b16fa9fc6be8890212076714b523e7c433a6be72a929972335a1f0 b/data/database/be57353616b16fa9fc6be8890212076714b523e7c433a6be72a929972335a1f0 deleted file mode 100644 index 568b2d28c873..000000000000 Binary files a/data/database/be57353616b16fa9fc6be8890212076714b523e7c433a6be72a929972335a1f0 and /dev/null differ diff --git a/data/database/be8d36f16b95d0cbbe7698d09baf9cda5e3e36dd7b57d7c586c2a383fc88a55f b/data/database/be8d36f16b95d0cbbe7698d09baf9cda5e3e36dd7b57d7c586c2a383fc88a55f deleted file mode 100644 index ca3be1998e20..000000000000 Binary files a/data/database/be8d36f16b95d0cbbe7698d09baf9cda5e3e36dd7b57d7c586c2a383fc88a55f and /dev/null differ diff --git a/data/database/9bb593a7112b7fab8c40d5f465b7f4d806fe721e933c4d759ead1bb4a36716e8 b/data/database/bf057de2c6d57c5f9070b91e96d1aa3e42e1b2e9ec3a7ada9d278f605b8db735 similarity index 100% rename from data/database/9bb593a7112b7fab8c40d5f465b7f4d806fe721e933c4d759ead1bb4a36716e8 rename to data/database/bf057de2c6d57c5f9070b91e96d1aa3e42e1b2e9ec3a7ada9d278f605b8db735 diff --git a/data/database/bf702e3b651a6553811df4a21848799191fa70a67a2eb14d4a82d6d0a29b4ac8 b/data/database/bf702e3b651a6553811df4a21848799191fa70a67a2eb14d4a82d6d0a29b4ac8 deleted file mode 100644 index ea058d52ff88..000000000000 Binary files a/data/database/bf702e3b651a6553811df4a21848799191fa70a67a2eb14d4a82d6d0a29b4ac8 and /dev/null differ diff --git a/data/database/c0b5321c16640af17e112b5094ecfb85ae2366cce184b60e868daae08d8acb91 b/data/database/c0b5321c16640af17e112b5094ecfb85ae2366cce184b60e868daae08d8acb91 deleted file mode 100644 index 68ac4b05216b..000000000000 Binary files a/data/database/c0b5321c16640af17e112b5094ecfb85ae2366cce184b60e868daae08d8acb91 and /dev/null differ diff --git a/data/database/c1441e2ea22d652744d8357ca46de206875712853ac36dd8c31af1f18b8c15fc b/data/database/c1441e2ea22d652744d8357ca46de206875712853ac36dd8c31af1f18b8c15fc deleted file mode 100644 index 8c3e36bb4ac6..000000000000 Binary files a/data/database/c1441e2ea22d652744d8357ca46de206875712853ac36dd8c31af1f18b8c15fc and /dev/null differ diff --git a/data/database/c1cc835a43e4ef01073be40ab4e6ed23fde2de4d0fd87495bf1f64dae76335b7 b/data/database/c1cc835a43e4ef01073be40ab4e6ed23fde2de4d0fd87495bf1f64dae76335b7 deleted file mode 100644 index fc78e162a1db..000000000000 Binary files a/data/database/c1cc835a43e4ef01073be40ab4e6ed23fde2de4d0fd87495bf1f64dae76335b7 and /dev/null differ diff --git a/data/database/c259e4eb9c93c50546758f634b63b067b24c313e02f937c841b55af73dbe1ae6 b/data/database/c259e4eb9c93c50546758f634b63b067b24c313e02f937c841b55af73dbe1ae6 deleted file mode 100644 index fc40df4af177..000000000000 Binary files a/data/database/c259e4eb9c93c50546758f634b63b067b24c313e02f937c841b55af73dbe1ae6 and /dev/null differ diff --git a/data/database/4810a3aab3576b685c80cc4a1d365e6b839b967f4beb4f110d76aa019157979f b/data/database/c265d45a63830d02c18446dc5ccd093ca57bfffbf3946d8b91bede5653d6fcd3 similarity index 100% rename from data/database/4810a3aab3576b685c80cc4a1d365e6b839b967f4beb4f110d76aa019157979f rename to data/database/c265d45a63830d02c18446dc5ccd093ca57bfffbf3946d8b91bede5653d6fcd3 diff --git a/data/database/c26ca1f1512f74b7a5f650591e954c5ef8a1e0acc1b02f499a5727f47abdb804 b/data/database/c26ca1f1512f74b7a5f650591e954c5ef8a1e0acc1b02f499a5727f47abdb804 deleted file mode 100644 index 0fd5e833d6ff..000000000000 Binary files a/data/database/c26ca1f1512f74b7a5f650591e954c5ef8a1e0acc1b02f499a5727f47abdb804 and /dev/null differ diff --git a/data/database/c6112d73479a078ce51ed67bd6d051bcc69011900b0151e9ce98dc4597ed45b5 b/data/database/c6112d73479a078ce51ed67bd6d051bcc69011900b0151e9ce98dc4597ed45b5 deleted file mode 100644 index 8cbc46055083..000000000000 Binary files a/data/database/c6112d73479a078ce51ed67bd6d051bcc69011900b0151e9ce98dc4597ed45b5 and /dev/null differ diff --git a/data/database/c68abe4e3e00fb98509f9699fc510116269a78a93bb00b6265b6559c6376f1b0 b/data/database/c68abe4e3e00fb98509f9699fc510116269a78a93bb00b6265b6559c6376f1b0 deleted file mode 100644 index 1231f2d0eb6c..000000000000 Binary files a/data/database/c68abe4e3e00fb98509f9699fc510116269a78a93bb00b6265b6559c6376f1b0 and /dev/null differ diff --git a/data/database/c6fbc030bf00587d7709369aa8b08e9f75e7b1ea70e420c29563cf8385c5f743 b/data/database/c6fbc030bf00587d7709369aa8b08e9f75e7b1ea70e420c29563cf8385c5f743 deleted file mode 100644 index 058ab69195ab..000000000000 Binary files a/data/database/c6fbc030bf00587d7709369aa8b08e9f75e7b1ea70e420c29563cf8385c5f743 and /dev/null differ diff --git a/data/database/ba288b8676df88116e6c0e318b0fc9373818544e94bfaca930a7a159fd024c1d b/data/database/c75fca0d7d41f8a46739cf76da8b250ad82e1a4faa5f0c198ad047c01f41b0f1 similarity index 100% rename from data/database/ba288b8676df88116e6c0e318b0fc9373818544e94bfaca930a7a159fd024c1d rename to data/database/c75fca0d7d41f8a46739cf76da8b250ad82e1a4faa5f0c198ad047c01f41b0f1 diff --git a/data/database/9393dadf1299a24ccfbda5e52dccfd51327edf62a3f8439b95e7b4341c967277 b/data/database/c76246d951cf96a3e5c3ea3cc1286fe5bd96ded5500808091510d6196633d70c similarity index 100% rename from data/database/9393dadf1299a24ccfbda5e52dccfd51327edf62a3f8439b95e7b4341c967277 rename to data/database/c76246d951cf96a3e5c3ea3cc1286fe5bd96ded5500808091510d6196633d70c diff --git a/data/database/c8cd418d910f0e939ffdb549287886c1fe60653b5e3be1eaf5ac0d312e3ef9ed b/data/database/c808bdac2a0b9880240474405b58911aff9cc762565f190dbecb0e1473deec4e similarity index 100% rename from data/database/c8cd418d910f0e939ffdb549287886c1fe60653b5e3be1eaf5ac0d312e3ef9ed rename to data/database/c808bdac2a0b9880240474405b58911aff9cc762565f190dbecb0e1473deec4e diff --git a/data/database/c8473a76ff71532eafc951c3f0debedbb1e1eac01ad95e35d4c3a06687c473c9 b/data/database/c8473a76ff71532eafc951c3f0debedbb1e1eac01ad95e35d4c3a06687c473c9 deleted file mode 100644 index 7b9805b5ef3b..000000000000 Binary files a/data/database/c8473a76ff71532eafc951c3f0debedbb1e1eac01ad95e35d4c3a06687c473c9 and /dev/null differ diff --git a/data/database/047a063255ca19741df408277a881823ff5c54b35c44c14fc2e01bc96ae3a7a8 b/data/database/c8f8a2db2ef512148b6b28f621d39f5df5a67a5a70e68f68f9ae6fb40ac56f5b similarity index 100% rename from data/database/047a063255ca19741df408277a881823ff5c54b35c44c14fc2e01bc96ae3a7a8 rename to data/database/c8f8a2db2ef512148b6b28f621d39f5df5a67a5a70e68f68f9ae6fb40ac56f5b diff --git a/data/database/c9d1f01f4a357f48e190e39fa6149a506865c9b3295bb403ab28df5f2f793899 b/data/database/c9d1f01f4a357f48e190e39fa6149a506865c9b3295bb403ab28df5f2f793899 deleted file mode 100644 index 25efaf320ab1..000000000000 Binary files a/data/database/c9d1f01f4a357f48e190e39fa6149a506865c9b3295bb403ab28df5f2f793899 and /dev/null differ diff --git a/data/database/ca15ccc53a5b3d6fae1b02c228eb0b3a2cf6e5a635b4bd26d36e4b830dfb7935 b/data/database/ca15ccc53a5b3d6fae1b02c228eb0b3a2cf6e5a635b4bd26d36e4b830dfb7935 new file mode 100644 index 000000000000..267c75046ddc Binary files /dev/null and b/data/database/ca15ccc53a5b3d6fae1b02c228eb0b3a2cf6e5a635b4bd26d36e4b830dfb7935 differ diff --git a/data/database/ca414e4bf6b6743840bdd7b6a66fe758a2b839b489f6cb5a8dab6079433ff51f b/data/database/ca414e4bf6b6743840bdd7b6a66fe758a2b839b489f6cb5a8dab6079433ff51f deleted file mode 100644 index a70f3e5903f0..000000000000 Binary files a/data/database/ca414e4bf6b6743840bdd7b6a66fe758a2b839b489f6cb5a8dab6079433ff51f and /dev/null differ diff --git a/data/database/ca82fc781f38a6ab3cc8b88e91a1a0bb57fa16703353f8e193d9919abeb8f213 b/data/database/ca82fc781f38a6ab3cc8b88e91a1a0bb57fa16703353f8e193d9919abeb8f213 new file mode 100644 index 000000000000..4dd06397df1c Binary files /dev/null and b/data/database/ca82fc781f38a6ab3cc8b88e91a1a0bb57fa16703353f8e193d9919abeb8f213 differ diff --git a/data/database/ca9fd24dc39e18fbf2539c733788f67123709be86e2b91c8a84f97e486ee15aa b/data/database/ca9fd24dc39e18fbf2539c733788f67123709be86e2b91c8a84f97e486ee15aa deleted file mode 100644 index 90bdcaa9639e..000000000000 Binary files a/data/database/ca9fd24dc39e18fbf2539c733788f67123709be86e2b91c8a84f97e486ee15aa and /dev/null differ diff --git a/data/database/2d985b7270b8659051738cd002a4371177747ad10e8e67f0e126a886de2314a9 b/data/database/cb2ed1d9132399ab181cbcd55a81f123e3aa33099f7392866d61d358ebfe4f8c similarity index 100% rename from data/database/2d985b7270b8659051738cd002a4371177747ad10e8e67f0e126a886de2314a9 rename to data/database/cb2ed1d9132399ab181cbcd55a81f123e3aa33099f7392866d61d358ebfe4f8c diff --git a/data/database/4aec5e28f827eeb6759121d890f2b9a8e2c9d3aca0e8a57e0d01bcea0fce76ae b/data/database/cb4845afb10aab2aee2973584b23244f45fa780976982a5c26c7d71fa8c01a14 similarity index 100% rename from data/database/4aec5e28f827eeb6759121d890f2b9a8e2c9d3aca0e8a57e0d01bcea0fce76ae rename to data/database/cb4845afb10aab2aee2973584b23244f45fa780976982a5c26c7d71fa8c01a14 diff --git a/data/database/cbbb432eff970c4e1b86f81f4dc34c8adf29e88b1250182813c35ac7ec4dedfb b/data/database/cbbb432eff970c4e1b86f81f4dc34c8adf29e88b1250182813c35ac7ec4dedfb deleted file mode 100644 index 6f5dbbe16faa..000000000000 Binary files a/data/database/cbbb432eff970c4e1b86f81f4dc34c8adf29e88b1250182813c35ac7ec4dedfb and /dev/null differ diff --git a/data/database/cc2d9bdf26879069fedeb32d491a4abba67302a43569a5bd761fe3eaa42c7073 b/data/database/cc2d9bdf26879069fedeb32d491a4abba67302a43569a5bd761fe3eaa42c7073 deleted file mode 100644 index a2868f1ae1f7..000000000000 Binary files a/data/database/cc2d9bdf26879069fedeb32d491a4abba67302a43569a5bd761fe3eaa42c7073 and /dev/null differ diff --git a/data/database/cc302fa1d32cbadbe3faa9f6ac5fb6ac592cfcce6058e3f1a94ca07fcc193247 b/data/database/cc302fa1d32cbadbe3faa9f6ac5fb6ac592cfcce6058e3f1a94ca07fcc193247 deleted file mode 100644 index c547b2931e1f..000000000000 Binary files a/data/database/cc302fa1d32cbadbe3faa9f6ac5fb6ac592cfcce6058e3f1a94ca07fcc193247 and /dev/null differ diff --git a/data/database/cc6222620d2d4f510a67768f6a9f370f04975f240b9ad04fabcf58095d8443df b/data/database/cc6222620d2d4f510a67768f6a9f370f04975f240b9ad04fabcf58095d8443df deleted file mode 100644 index f142cc761915..000000000000 Binary files a/data/database/cc6222620d2d4f510a67768f6a9f370f04975f240b9ad04fabcf58095d8443df and /dev/null differ diff --git a/data/database/cc6db2a111143ef82e528429c9520ec3271ee2ff70f35d67bb4b0b126623303c b/data/database/cc6db2a111143ef82e528429c9520ec3271ee2ff70f35d67bb4b0b126623303c deleted file mode 100644 index 414c07f4b769..000000000000 Binary files a/data/database/cc6db2a111143ef82e528429c9520ec3271ee2ff70f35d67bb4b0b126623303c and /dev/null differ diff --git a/data/database/f311fd934bfee4f38334274e0f0312051353294c6e010dd7cc0d55029e67e6ef b/data/database/ccaba012161642f7b50746e075650ee70cafd4a94afb1799ce4b3b66c70b3311 similarity index 100% rename from data/database/f311fd934bfee4f38334274e0f0312051353294c6e010dd7cc0d55029e67e6ef rename to data/database/ccaba012161642f7b50746e075650ee70cafd4a94afb1799ce4b3b66c70b3311 diff --git a/data/database/2bc00684d52642f55b9d73a02bff4607b2db6848b865cdd7550a16b828d94075 b/data/database/cd3ba5949c52b1a8f4645ac6ed86dcfca9d5e1aa1439d6088b62c413db22d5f7 similarity index 100% rename from data/database/2bc00684d52642f55b9d73a02bff4607b2db6848b865cdd7550a16b828d94075 rename to data/database/cd3ba5949c52b1a8f4645ac6ed86dcfca9d5e1aa1439d6088b62c413db22d5f7 diff --git a/data/database/ce1dfcf0f769240c91d0bda6a56536aae86af5dd9d52693cf40f068c32100ec1 b/data/database/ce1dfcf0f769240c91d0bda6a56536aae86af5dd9d52693cf40f068c32100ec1 deleted file mode 100644 index e3b128a26980..000000000000 Binary files a/data/database/ce1dfcf0f769240c91d0bda6a56536aae86af5dd9d52693cf40f068c32100ec1 and /dev/null differ diff --git a/data/database/ce5bd1cbf2cd1f7f8f91c2c0fdd12c9fe499c3763676e21a8d3f74b4b8fd0db4 b/data/database/ce5bd1cbf2cd1f7f8f91c2c0fdd12c9fe499c3763676e21a8d3f74b4b8fd0db4 deleted file mode 100644 index 893a69142ebc..000000000000 Binary files a/data/database/ce5bd1cbf2cd1f7f8f91c2c0fdd12c9fe499c3763676e21a8d3f74b4b8fd0db4 and /dev/null differ diff --git a/data/database/ced261a36a5d5c2d958cdb7d449d04e3703711c476953b8cc317c213a5df2196 b/data/database/ced261a36a5d5c2d958cdb7d449d04e3703711c476953b8cc317c213a5df2196 deleted file mode 100644 index 417047c29815..000000000000 Binary files a/data/database/ced261a36a5d5c2d958cdb7d449d04e3703711c476953b8cc317c213a5df2196 and /dev/null differ diff --git a/data/database/039ece76efd9835162fc2d8689088044ec5ce06797bed5ae71542bd2f1f5abbf b/data/database/cee3ab71ac3de0e4f84a18c763d4acc7bb977a54df97c47efab60fcbee4d4c3e similarity index 100% rename from data/database/039ece76efd9835162fc2d8689088044ec5ce06797bed5ae71542bd2f1f5abbf rename to data/database/cee3ab71ac3de0e4f84a18c763d4acc7bb977a54df97c47efab60fcbee4d4c3e diff --git a/data/database/b8c6ee68bdfb886657f82d76a741df9ba18715219508a567acc19c0d17c72b84 b/data/database/cf5e4c9d1e7120313412b1a8bd2aee9473a735621493edcfc832f9de0c18ebd6 similarity index 100% rename from data/database/b8c6ee68bdfb886657f82d76a741df9ba18715219508a567acc19c0d17c72b84 rename to data/database/cf5e4c9d1e7120313412b1a8bd2aee9473a735621493edcfc832f9de0c18ebd6 diff --git a/data/database/cfd3fffa1fb8f31843973a0846832ee71e3b56e96dd850b67592336947eaf5db b/data/database/cfd3fffa1fb8f31843973a0846832ee71e3b56e96dd850b67592336947eaf5db deleted file mode 100644 index 3045673b4007..000000000000 Binary files a/data/database/cfd3fffa1fb8f31843973a0846832ee71e3b56e96dd850b67592336947eaf5db and /dev/null differ diff --git a/data/database/d0c9697104529a5072dfbe6e02c10f422e25b6c3dbbf88b5f2ecac2484a84e2f b/data/database/d0c9697104529a5072dfbe6e02c10f422e25b6c3dbbf88b5f2ecac2484a84e2f deleted file mode 100644 index ddd5f7df81ea..000000000000 Binary files a/data/database/d0c9697104529a5072dfbe6e02c10f422e25b6c3dbbf88b5f2ecac2484a84e2f and /dev/null differ diff --git a/data/database/2e01fbbd74412cad4111bd83ff287c497a7f5e2b9398901edfbde7d5b7e0ed1b b/data/database/d1081357767545ed57e09fe6b8f12e87d928c3f14e15f25dfe8c8f7fe1d7e17e similarity index 100% rename from data/database/2e01fbbd74412cad4111bd83ff287c497a7f5e2b9398901edfbde7d5b7e0ed1b rename to data/database/d1081357767545ed57e09fe6b8f12e87d928c3f14e15f25dfe8c8f7fe1d7e17e diff --git a/data/database/d10da6b021c40fa2e0890b09f9765be8b3c3b73900fdd7402e116124c352c58b b/data/database/d10da6b021c40fa2e0890b09f9765be8b3c3b73900fdd7402e116124c352c58b deleted file mode 100644 index b29cfdbb6b4b..000000000000 Binary files a/data/database/d10da6b021c40fa2e0890b09f9765be8b3c3b73900fdd7402e116124c352c58b and /dev/null differ diff --git a/data/database/6fb040022caa1c42f5f73ce9597c30a2fc396e65be1550ca2ff4b7f403dff3e1 b/data/database/d13df5ff96d821ea5d2f06262ed5364498fd404c00c421b6edc032f4c33dab75 similarity index 100% rename from data/database/6fb040022caa1c42f5f73ce9597c30a2fc396e65be1550ca2ff4b7f403dff3e1 rename to data/database/d13df5ff96d821ea5d2f06262ed5364498fd404c00c421b6edc032f4c33dab75 diff --git a/data/database/63c7a8b804363c3126603b836161c1f9b92af8fd40689859dfc3b2b2316acf88 b/data/database/d152ef417854e83a015b362aa76530f03eec2a51915c91ea534fd162112a1196 similarity index 99% rename from data/database/63c7a8b804363c3126603b836161c1f9b92af8fd40689859dfc3b2b2316acf88 rename to data/database/d152ef417854e83a015b362aa76530f03eec2a51915c91ea534fd162112a1196 index ff23a12d9872..cec416429d4e 100644 Binary files a/data/database/63c7a8b804363c3126603b836161c1f9b92af8fd40689859dfc3b2b2316acf88 and b/data/database/d152ef417854e83a015b362aa76530f03eec2a51915c91ea534fd162112a1196 differ diff --git a/data/database/d214f7f906813b9af644b355a7be07796a3a4761742dbc59ee6570f9d837d495 b/data/database/d214f7f906813b9af644b355a7be07796a3a4761742dbc59ee6570f9d837d495 new file mode 100644 index 000000000000..935d4e5f6d69 Binary files /dev/null and b/data/database/d214f7f906813b9af644b355a7be07796a3a4761742dbc59ee6570f9d837d495 differ diff --git a/data/database/8f72091d5d9cc60274d2ddcbd2d8e2bef6740d5db01b46b31dc570cb9730989f b/data/database/d35f2665f59d20ef2195fdbcc2283c0cb12139258b64e3eb58d690be4b731ba0 similarity index 100% rename from data/database/8f72091d5d9cc60274d2ddcbd2d8e2bef6740d5db01b46b31dc570cb9730989f rename to data/database/d35f2665f59d20ef2195fdbcc2283c0cb12139258b64e3eb58d690be4b731ba0 diff --git a/data/database/00ddc9940094f48d094c6e91f38170a83474e996f1f0e14ab2e487fd7c418809 b/data/database/d43e4138f8f43d3de4f902cceb52a3f8974ca32b65f325b7d123b1616510c05d similarity index 100% rename from data/database/00ddc9940094f48d094c6e91f38170a83474e996f1f0e14ab2e487fd7c418809 rename to data/database/d43e4138f8f43d3de4f902cceb52a3f8974ca32b65f325b7d123b1616510c05d diff --git a/data/database/d48c7937c6adc9eb39ed6f706550f32fc015099982f55d4d5f3204222ea4dd57 b/data/database/d48c7937c6adc9eb39ed6f706550f32fc015099982f55d4d5f3204222ea4dd57 deleted file mode 100644 index b3c4234ddc61..000000000000 Binary files a/data/database/d48c7937c6adc9eb39ed6f706550f32fc015099982f55d4d5f3204222ea4dd57 and /dev/null differ diff --git a/data/database/d4d006a8e18bc4ef1d6d686f7a2db7b72e245f9c1ed41dd2164a049099b12369 b/data/database/d4d006a8e18bc4ef1d6d686f7a2db7b72e245f9c1ed41dd2164a049099b12369 deleted file mode 100644 index 51c54ca02a10..000000000000 Binary files a/data/database/d4d006a8e18bc4ef1d6d686f7a2db7b72e245f9c1ed41dd2164a049099b12369 and /dev/null differ diff --git a/data/database/d4ebdf74b07ec0877107391c7ec038d86e38e55d840654acfa3da1bbe7765e0e b/data/database/d4ebdf74b07ec0877107391c7ec038d86e38e55d840654acfa3da1bbe7765e0e deleted file mode 100644 index 33ba11f52fc5..000000000000 Binary files a/data/database/d4ebdf74b07ec0877107391c7ec038d86e38e55d840654acfa3da1bbe7765e0e and /dev/null differ diff --git a/data/database/d5c5a89757907e92dcc012c08a23fcda7e96d40e1c28f4b70b2218257f243679 b/data/database/d5c5a89757907e92dcc012c08a23fcda7e96d40e1c28f4b70b2218257f243679 deleted file mode 100644 index ca27064b4ba9..000000000000 Binary files a/data/database/d5c5a89757907e92dcc012c08a23fcda7e96d40e1c28f4b70b2218257f243679 and /dev/null differ diff --git a/data/database/e340291839ad3c6b75780e356609efc564580db756d316d98fc3c362154e74a3 b/data/database/d5edc14897a9013920806769d7e1e46bfdfd3f9797ce796e5d2b219084de3e26 similarity index 96% rename from data/database/e340291839ad3c6b75780e356609efc564580db756d316d98fc3c362154e74a3 rename to data/database/d5edc14897a9013920806769d7e1e46bfdfd3f9797ce796e5d2b219084de3e26 index c547b2931e1f..507d7c1304f5 100644 Binary files a/data/database/e340291839ad3c6b75780e356609efc564580db756d316d98fc3c362154e74a3 and b/data/database/d5edc14897a9013920806769d7e1e46bfdfd3f9797ce796e5d2b219084de3e26 differ diff --git a/data/database/939c0d11ef192e85f93644793c102650f4aa8155da939113f14345839d9527b6 b/data/database/d7131e04f7abe1890300c2cb087e4f805d0c53eedc4f907ff1db0bf303d7a9a8 similarity index 100% rename from data/database/939c0d11ef192e85f93644793c102650f4aa8155da939113f14345839d9527b6 rename to data/database/d7131e04f7abe1890300c2cb087e4f805d0c53eedc4f907ff1db0bf303d7a9a8 diff --git a/data/database/d776f7dde2d6448bc079ac34f32239b46106f6f29ef85a6d404233bf78260297 b/data/database/d776f7dde2d6448bc079ac34f32239b46106f6f29ef85a6d404233bf78260297 deleted file mode 100644 index 11eccb98a83d..000000000000 Binary files a/data/database/d776f7dde2d6448bc079ac34f32239b46106f6f29ef85a6d404233bf78260297 and /dev/null differ diff --git a/data/database/1ebad39590cb2a34c65e0c067067f3929d8662e7bc95e7097622f15256321d48 b/data/database/d87b91a014d2e8e9d32470d52dc9f3b4263a9eb659eb032675027682346688b9 similarity index 100% rename from data/database/1ebad39590cb2a34c65e0c067067f3929d8662e7bc95e7097622f15256321d48 rename to data/database/d87b91a014d2e8e9d32470d52dc9f3b4263a9eb659eb032675027682346688b9 diff --git a/data/database/8db1ca3ee966c9388fbd6e64b3d1b8072e60a68e19394239319ba20543cdcbb1 b/data/database/d88e05cf484a2fa55bd0888d856a037e8518dcfee3d69058270e4afdc5022952 similarity index 100% rename from data/database/8db1ca3ee966c9388fbd6e64b3d1b8072e60a68e19394239319ba20543cdcbb1 rename to data/database/d88e05cf484a2fa55bd0888d856a037e8518dcfee3d69058270e4afdc5022952 diff --git a/data/database/b5bdafe0b69b1d9f7f8d874b5a146681b1092d2cbaeec0d48cbe010bd8df2725 b/data/database/d8fcc135e6fea152d25c095153b1568a1cd43775c6e3689a3e2e021bbb054d06 similarity index 100% rename from data/database/b5bdafe0b69b1d9f7f8d874b5a146681b1092d2cbaeec0d48cbe010bd8df2725 rename to data/database/d8fcc135e6fea152d25c095153b1568a1cd43775c6e3689a3e2e021bbb054d06 diff --git a/data/database/d94b3ae93f6229f2d5176d049c985e5f4576b5159a279c7aafb3dab81af8409e b/data/database/d94b3ae93f6229f2d5176d049c985e5f4576b5159a279c7aafb3dab81af8409e deleted file mode 100644 index 0f134ce6f319..000000000000 Binary files a/data/database/d94b3ae93f6229f2d5176d049c985e5f4576b5159a279c7aafb3dab81af8409e and /dev/null differ diff --git a/data/database/d95e4c2bdc211bf30dfb11c0d4a2732f49144ab9c7c046f336e03732ac5d3b7d b/data/database/d95e4c2bdc211bf30dfb11c0d4a2732f49144ab9c7c046f336e03732ac5d3b7d deleted file mode 100644 index 9f92af8b6d51..000000000000 Binary files a/data/database/d95e4c2bdc211bf30dfb11c0d4a2732f49144ab9c7c046f336e03732ac5d3b7d and /dev/null differ diff --git a/data/database/d9bef8ce7c9facdc345ef980ea8f4ac745a8d64ec0a465c8c59c2d1e0a7750cb b/data/database/d9bef8ce7c9facdc345ef980ea8f4ac745a8d64ec0a465c8c59c2d1e0a7750cb deleted file mode 100644 index 6c6934696d7c..000000000000 Binary files a/data/database/d9bef8ce7c9facdc345ef980ea8f4ac745a8d64ec0a465c8c59c2d1e0a7750cb and /dev/null differ diff --git a/data/database/2e826746102fb56273dffa3c00be10469151117f1b82729803fda81b777f135d b/data/database/d9fd79b999891b381969dbed06af21e6431e5643898672700d1dd765b1c6fa9c similarity index 100% rename from data/database/2e826746102fb56273dffa3c00be10469151117f1b82729803fda81b777f135d rename to data/database/d9fd79b999891b381969dbed06af21e6431e5643898672700d1dd765b1c6fa9c diff --git a/data/database/db11a4e8bad8bd8d1c95d4053df8de26e45d6e5f8638df5b616e6b92de7ab9a1 b/data/database/db11a4e8bad8bd8d1c95d4053df8de26e45d6e5f8638df5b616e6b92de7ab9a1 deleted file mode 100644 index 9e38863b4ea6..000000000000 Binary files a/data/database/db11a4e8bad8bd8d1c95d4053df8de26e45d6e5f8638df5b616e6b92de7ab9a1 and /dev/null differ diff --git a/data/database/db9ec410faf74859b4cd6b6dcc78343d9b7055084e01d6ad2a815b0b92f0a873 b/data/database/db9ec410faf74859b4cd6b6dcc78343d9b7055084e01d6ad2a815b0b92f0a873 deleted file mode 100644 index 14f1aafe67cd..000000000000 Binary files a/data/database/db9ec410faf74859b4cd6b6dcc78343d9b7055084e01d6ad2a815b0b92f0a873 and /dev/null differ diff --git a/data/database/dbcb4803a0d0979a4cea19cd2fc1d64c580d5ba4c58ba6f4730a56e068f1fe73 b/data/database/dbcb4803a0d0979a4cea19cd2fc1d64c580d5ba4c58ba6f4730a56e068f1fe73 deleted file mode 100644 index 8d002ce6c1c2..000000000000 Binary files a/data/database/dbcb4803a0d0979a4cea19cd2fc1d64c580d5ba4c58ba6f4730a56e068f1fe73 and /dev/null differ diff --git a/data/database/d6acf31a499553afaacd822fd0dc59f560fecf795c8e38105a7e9bdbafdcb9d8 b/data/database/dc76efb8b459da129d2f1ee5108b900e259a009ca0d016a70024c88ed8c9ce67 similarity index 100% rename from data/database/d6acf31a499553afaacd822fd0dc59f560fecf795c8e38105a7e9bdbafdcb9d8 rename to data/database/dc76efb8b459da129d2f1ee5108b900e259a009ca0d016a70024c88ed8c9ce67 diff --git a/data/database/ddc0f3a8a56d0f65bc7e2e8710c351f83a62df029974e8debdeb2ee0caf53c4c b/data/database/dc7a21bede135d3042e3b6b8130aa29b41939e4bb5ca00d8799dc1e75939d2b6 similarity index 100% rename from data/database/ddc0f3a8a56d0f65bc7e2e8710c351f83a62df029974e8debdeb2ee0caf53c4c rename to data/database/dc7a21bede135d3042e3b6b8130aa29b41939e4bb5ca00d8799dc1e75939d2b6 diff --git a/data/database/dc7efc374ed54876815647c07d51cf6521022a5b2fbe6f64e8b1ec5b41c0a2ab b/data/database/dc7efc374ed54876815647c07d51cf6521022a5b2fbe6f64e8b1ec5b41c0a2ab deleted file mode 100644 index d1b5d7afd10d..000000000000 Binary files a/data/database/dc7efc374ed54876815647c07d51cf6521022a5b2fbe6f64e8b1ec5b41c0a2ab and /dev/null differ diff --git a/data/database/dcad132851399ab1faed6864a8db254580273097a5deb12c9d86b84e11b97968 b/data/database/dcad132851399ab1faed6864a8db254580273097a5deb12c9d86b84e11b97968 deleted file mode 100644 index 3ce3b1b1631d..000000000000 Binary files a/data/database/dcad132851399ab1faed6864a8db254580273097a5deb12c9d86b84e11b97968 and /dev/null differ diff --git a/data/database/ce1d1fd7973dc204cfb23f63e767b708aaed046ca036b81cd715d04a51dc91c5 b/data/database/dcc0ff4f8abb31a47bb5c4594d3ac8dd5d518c25928da7dd61e19a97eda88a74 similarity index 100% rename from data/database/ce1d1fd7973dc204cfb23f63e767b708aaed046ca036b81cd715d04a51dc91c5 rename to data/database/dcc0ff4f8abb31a47bb5c4594d3ac8dd5d518c25928da7dd61e19a97eda88a74 diff --git a/data/database/fc703e868abb5268720db62707a30e741535064224705aea9f5393f2099acb2c b/data/database/dd1941ca2ec2d446d6b0d4a09f703d838ff5468696505650d1b96791998ee8d9 similarity index 100% rename from data/database/fc703e868abb5268720db62707a30e741535064224705aea9f5393f2099acb2c rename to data/database/dd1941ca2ec2d446d6b0d4a09f703d838ff5468696505650d1b96791998ee8d9 diff --git a/data/database/dd975ebf0dbe330cbd075a001590f81d2a96d9d1f2018bb0829e462845b4e008 b/data/database/dd975ebf0dbe330cbd075a001590f81d2a96d9d1f2018bb0829e462845b4e008 deleted file mode 100644 index 907ab5f37cc2..000000000000 Binary files a/data/database/dd975ebf0dbe330cbd075a001590f81d2a96d9d1f2018bb0829e462845b4e008 and /dev/null differ diff --git a/data/database/1cd232551cfcdccd4f72eb35cb6a6547781884dbc60718c041390923d7a18afc b/data/database/dfe891c1ba8cf785bd0b32f69f208b74b10a348511868a7157f4ca9e80efae10 similarity index 100% rename from data/database/1cd232551cfcdccd4f72eb35cb6a6547781884dbc60718c041390923d7a18afc rename to data/database/dfe891c1ba8cf785bd0b32f69f208b74b10a348511868a7157f4ca9e80efae10 diff --git a/data/database/d79190028635c9cbeea812de12e994898e6ce4c11015a0273b6e0c143ff990df b/data/database/e0392e0b38671e8a5a0b7df25ed775f1e337b4f51c6ec4d435da5e57d0a862f1 similarity index 76% rename from data/database/d79190028635c9cbeea812de12e994898e6ce4c11015a0273b6e0c143ff990df rename to data/database/e0392e0b38671e8a5a0b7df25ed775f1e337b4f51c6ec4d435da5e57d0a862f1 index 64c3812be2a5..49fc4485a85e 100644 Binary files a/data/database/d79190028635c9cbeea812de12e994898e6ce4c11015a0273b6e0c143ff990df and b/data/database/e0392e0b38671e8a5a0b7df25ed775f1e337b4f51c6ec4d435da5e57d0a862f1 differ diff --git a/data/database/e0bc2209d524007cd874ed78069cf22d57548d630319885eb0dd8cc7e5651987 b/data/database/e0bc2209d524007cd874ed78069cf22d57548d630319885eb0dd8cc7e5651987 deleted file mode 100644 index 9c9e6796f7f4..000000000000 Binary files a/data/database/e0bc2209d524007cd874ed78069cf22d57548d630319885eb0dd8cc7e5651987 and /dev/null differ diff --git a/data/database/e0c9d7ba1f0ea91896eeab4408fd3e1add77080dbce57c6d64a3aeb07a77877a b/data/database/e0c9d7ba1f0ea91896eeab4408fd3e1add77080dbce57c6d64a3aeb07a77877a deleted file mode 100644 index f69bae7b8aea..000000000000 Binary files a/data/database/e0c9d7ba1f0ea91896eeab4408fd3e1add77080dbce57c6d64a3aeb07a77877a and /dev/null differ diff --git a/data/database/e1b171c9b29ddb70c4506e7134f9101fc2f43d76eb719382e4a7ed38041306ff b/data/database/e1b171c9b29ddb70c4506e7134f9101fc2f43d76eb719382e4a7ed38041306ff new file mode 100644 index 000000000000..1c28a2914e37 Binary files /dev/null and b/data/database/e1b171c9b29ddb70c4506e7134f9101fc2f43d76eb719382e4a7ed38041306ff differ diff --git a/data/database/e1fb3b7a16ef48d10651d60ebd654274552d0552f7e6665f4a778a94cfcab9ad b/data/database/e1fb3b7a16ef48d10651d60ebd654274552d0552f7e6665f4a778a94cfcab9ad deleted file mode 100644 index 58ec3afb9e68..000000000000 Binary files a/data/database/e1fb3b7a16ef48d10651d60ebd654274552d0552f7e6665f4a778a94cfcab9ad and /dev/null differ diff --git a/data/database/e2b8408ba185250973df2572f0ce641764f7c52695df85cc82c127dc5961f60f b/data/database/e2b8408ba185250973df2572f0ce641764f7c52695df85cc82c127dc5961f60f deleted file mode 100644 index 5f1421f43ac0..000000000000 Binary files a/data/database/e2b8408ba185250973df2572f0ce641764f7c52695df85cc82c127dc5961f60f and /dev/null differ diff --git a/data/database/e36f93f6f757eb90c105910c4c2f3f33eab33422a9727298592083f27b73fd74 b/data/database/e36f93f6f757eb90c105910c4c2f3f33eab33422a9727298592083f27b73fd74 deleted file mode 100644 index 72e5a5413971..000000000000 Binary files a/data/database/e36f93f6f757eb90c105910c4c2f3f33eab33422a9727298592083f27b73fd74 and /dev/null differ diff --git a/data/database/e3905673df71cb0f65aa504a04c2423b13c915185f7aae472183132122caaf4e b/data/database/e3905673df71cb0f65aa504a04c2423b13c915185f7aae472183132122caaf4e deleted file mode 100644 index 7f7df8658c58..000000000000 Binary files a/data/database/e3905673df71cb0f65aa504a04c2423b13c915185f7aae472183132122caaf4e and /dev/null differ diff --git a/data/database/e3bcc03b57388effd6e5c5bd53ba74186ddae98b663096e0cdc8fd9a30b72505 b/data/database/e3bcc03b57388effd6e5c5bd53ba74186ddae98b663096e0cdc8fd9a30b72505 deleted file mode 100644 index f51bfdd247f0..000000000000 Binary files a/data/database/e3bcc03b57388effd6e5c5bd53ba74186ddae98b663096e0cdc8fd9a30b72505 and /dev/null differ diff --git a/data/database/e4bd9ad5bdeadb0416a027b7f0ee6e342cfe24702922a97095878fbe965c6efd b/data/database/e4bd9ad5bdeadb0416a027b7f0ee6e342cfe24702922a97095878fbe965c6efd deleted file mode 100644 index 4b44457c0079..000000000000 Binary files a/data/database/e4bd9ad5bdeadb0416a027b7f0ee6e342cfe24702922a97095878fbe965c6efd and /dev/null differ diff --git a/data/database/9f43319bbd3cbc370b6f467d29209b9a0175c33cea23a3c3901e12b5cbeece01 b/data/database/e51d678259b03827a2b48437e830c630b5a36a75288d8678a2e0ab4eaa12b404 similarity index 100% rename from data/database/9f43319bbd3cbc370b6f467d29209b9a0175c33cea23a3c3901e12b5cbeece01 rename to data/database/e51d678259b03827a2b48437e830c630b5a36a75288d8678a2e0ab4eaa12b404 diff --git a/data/database/5121de6955f03a8244fede3182a1b647b8653037e50b5d6636ce10f88f7e7d92 b/data/database/e5f66566fc91642bb4d3485d323e722a324f29747e25be4988af464d5f3b694d similarity index 100% rename from data/database/5121de6955f03a8244fede3182a1b647b8653037e50b5d6636ce10f88f7e7d92 rename to data/database/e5f66566fc91642bb4d3485d323e722a324f29747e25be4988af464d5f3b694d diff --git a/data/database/e604997328cb69004f66af6d754aa246090c9f3ea728cab171e665885b22bade b/data/database/e604997328cb69004f66af6d754aa246090c9f3ea728cab171e665885b22bade new file mode 100644 index 000000000000..ed2155ce4e75 Binary files /dev/null and b/data/database/e604997328cb69004f66af6d754aa246090c9f3ea728cab171e665885b22bade differ diff --git a/data/database/e61411f077f5b46c0aecb0f121de464183fd58f143b80ad607eaff296b49ef6e b/data/database/e61411f077f5b46c0aecb0f121de464183fd58f143b80ad607eaff296b49ef6e deleted file mode 100644 index 3f1d75b31465..000000000000 Binary files a/data/database/e61411f077f5b46c0aecb0f121de464183fd58f143b80ad607eaff296b49ef6e and /dev/null differ diff --git a/data/database/e634665ea1a85eb8c0d717df3b04bb7d708ba45462a0cfc874dfff9fc8d36024 b/data/database/e634665ea1a85eb8c0d717df3b04bb7d708ba45462a0cfc874dfff9fc8d36024 deleted file mode 100644 index 68ac9eb3d957..000000000000 Binary files a/data/database/e634665ea1a85eb8c0d717df3b04bb7d708ba45462a0cfc874dfff9fc8d36024 and /dev/null differ diff --git a/data/database/e68017b2b9bbaa4b0c962ef6eeddbe670f63587c766345f290381009d232139a b/data/database/e68017b2b9bbaa4b0c962ef6eeddbe670f63587c766345f290381009d232139a deleted file mode 100644 index c3bb1c5dc2e5..000000000000 Binary files a/data/database/e68017b2b9bbaa4b0c962ef6eeddbe670f63587c766345f290381009d232139a and /dev/null differ diff --git a/data/database/7b5acb9bd57f3bd1e65eff7babc9056733074b784af9f7c3f8263d1bf14e4b23 b/data/database/e6c0eb7aeab86949280de074000bc0ee9a143496f3822f1f9a363eff8e74d02c similarity index 100% rename from data/database/7b5acb9bd57f3bd1e65eff7babc9056733074b784af9f7c3f8263d1bf14e4b23 rename to data/database/e6c0eb7aeab86949280de074000bc0ee9a143496f3822f1f9a363eff8e74d02c diff --git a/data/database/e772e8771642c98648813e705e3274a97067a09b7943f02db89b138f9a97e18a b/data/database/e772e8771642c98648813e705e3274a97067a09b7943f02db89b138f9a97e18a deleted file mode 100644 index 621c691ed165..000000000000 Binary files a/data/database/e772e8771642c98648813e705e3274a97067a09b7943f02db89b138f9a97e18a and /dev/null differ diff --git a/data/database/e7fad6e4b8bdae613cfe05e458352d5e8c94e01b73cfc2c3c747f73f8149dbf8 b/data/database/e7fad6e4b8bdae613cfe05e458352d5e8c94e01b73cfc2c3c747f73f8149dbf8 deleted file mode 100644 index fead68d95173..000000000000 Binary files a/data/database/e7fad6e4b8bdae613cfe05e458352d5e8c94e01b73cfc2c3c747f73f8149dbf8 and /dev/null differ diff --git a/data/database/e8199b842ec5fc784b7381f154fcef06add42f42f41a0db60c12b4707a3ae0ab b/data/database/e8199b842ec5fc784b7381f154fcef06add42f42f41a0db60c12b4707a3ae0ab deleted file mode 100644 index 14fc5993c621..000000000000 Binary files a/data/database/e8199b842ec5fc784b7381f154fcef06add42f42f41a0db60c12b4707a3ae0ab and /dev/null differ diff --git a/data/database/a100a32228b5f144d3b5431fab684867b461ab3413c62ef2fd0c8ab76695b4bf b/data/database/ea0fad995358d9a547596801ae68547d62260242e450bc6b3cc1171ae2e9d9e8 similarity index 100% rename from data/database/a100a32228b5f144d3b5431fab684867b461ab3413c62ef2fd0c8ab76695b4bf rename to data/database/ea0fad995358d9a547596801ae68547d62260242e450bc6b3cc1171ae2e9d9e8 diff --git a/data/database/ea6c1d723ea71d8ec139c7b53f0b3bd523db28f5ea418cf88fae7e59d9d11c0c b/data/database/ea6c1d723ea71d8ec139c7b53f0b3bd523db28f5ea418cf88fae7e59d9d11c0c deleted file mode 100644 index 86f00b89c943..000000000000 Binary files a/data/database/ea6c1d723ea71d8ec139c7b53f0b3bd523db28f5ea418cf88fae7e59d9d11c0c and /dev/null differ diff --git a/data/database/eabc3e63e89d1017fe9020b38c33c484a7f49cda67af9f66c922f6d0305f435a b/data/database/eabc3e63e89d1017fe9020b38c33c484a7f49cda67af9f66c922f6d0305f435a deleted file mode 100644 index b2cc145c8d48..000000000000 Binary files a/data/database/eabc3e63e89d1017fe9020b38c33c484a7f49cda67af9f66c922f6d0305f435a and /dev/null differ diff --git a/data/database/8a1b8af1e97bef88b9fdbe4c7e48d5132fafec5cce68c25aeaaf5cb10eb2ef63 b/data/database/eafd74adbd3a21d76a9fe66c4ca0e398553b73ae89156908cebe18355b2bf16b similarity index 76% rename from data/database/8a1b8af1e97bef88b9fdbe4c7e48d5132fafec5cce68c25aeaaf5cb10eb2ef63 rename to data/database/eafd74adbd3a21d76a9fe66c4ca0e398553b73ae89156908cebe18355b2bf16b index 5063e7f9252b..b12727b3e5d7 100644 Binary files a/data/database/8a1b8af1e97bef88b9fdbe4c7e48d5132fafec5cce68c25aeaaf5cb10eb2ef63 and b/data/database/eafd74adbd3a21d76a9fe66c4ca0e398553b73ae89156908cebe18355b2bf16b differ diff --git a/data/database/e3167920aaaf54a55422b90ddf39b11ebd0e38a21824d50f231b38d0b2b1aac9 b/data/database/eb6df951c0690682e0780246e9547e4a8e9835f26b83da8c6d4d6c1c05c314d7 similarity index 100% rename from data/database/e3167920aaaf54a55422b90ddf39b11ebd0e38a21824d50f231b38d0b2b1aac9 rename to data/database/eb6df951c0690682e0780246e9547e4a8e9835f26b83da8c6d4d6c1c05c314d7 diff --git a/data/database/ec526ecb7905b0549511241f75f3064719d67622e3c0e630e265b24f42cbb9c8 b/data/database/ec526ecb7905b0549511241f75f3064719d67622e3c0e630e265b24f42cbb9c8 deleted file mode 100644 index 242da5eebc9d..000000000000 Binary files a/data/database/ec526ecb7905b0549511241f75f3064719d67622e3c0e630e265b24f42cbb9c8 and /dev/null differ diff --git a/data/database/ecb8bd66fa94d6e858a4e6fff184a1825bcc4cc2917f51dc944e060b7770a346 b/data/database/ecb8bd66fa94d6e858a4e6fff184a1825bcc4cc2917f51dc944e060b7770a346 deleted file mode 100644 index b82a6912253f..000000000000 Binary files a/data/database/ecb8bd66fa94d6e858a4e6fff184a1825bcc4cc2917f51dc944e060b7770a346 and /dev/null differ diff --git a/data/database/58d20a37ccb3274b8cf9d19da9f4c9fa2fe28a3ee3f43f3e0669045a225711ff b/data/database/edb2857967319806b9af62c5b73e9f57373a05c0f062bc45bb325ab502fcb927 similarity index 100% rename from data/database/58d20a37ccb3274b8cf9d19da9f4c9fa2fe28a3ee3f43f3e0669045a225711ff rename to data/database/edb2857967319806b9af62c5b73e9f57373a05c0f062bc45bb325ab502fcb927 diff --git a/data/database/ee93c7ef6bf7f5ca6370c66c1780e336344f1178ecc4dac5cfb9a97a9ab2fd8c b/data/database/ee93c7ef6bf7f5ca6370c66c1780e336344f1178ecc4dac5cfb9a97a9ab2fd8c deleted file mode 100644 index 0e07889d2703..000000000000 Binary files a/data/database/ee93c7ef6bf7f5ca6370c66c1780e336344f1178ecc4dac5cfb9a97a9ab2fd8c and /dev/null differ diff --git a/data/database/dd3c3e6afc9b87792e99ccee9a1492a7dd29f97d74eaa09fef5a2ab472564a31 b/data/database/eecd508e6777bc9a9271808fc74f36344f0e61278c1dcddf874ae6e8d7c24aa8 similarity index 99% rename from data/database/dd3c3e6afc9b87792e99ccee9a1492a7dd29f97d74eaa09fef5a2ab472564a31 rename to data/database/eecd508e6777bc9a9271808fc74f36344f0e61278c1dcddf874ae6e8d7c24aa8 index 1f64695666fb..5edb7bfc4458 100644 Binary files a/data/database/dd3c3e6afc9b87792e99ccee9a1492a7dd29f97d74eaa09fef5a2ab472564a31 and b/data/database/eecd508e6777bc9a9271808fc74f36344f0e61278c1dcddf874ae6e8d7c24aa8 differ diff --git a/data/database/ce44f2cc42aa6940acfe9601377d4ce1516b5af27cf329be4c47bd3e7d1cff3b b/data/database/eef5bed02469f1ed650258c60ef68fd81bd827a3ceb6e80c94c26b665996462d similarity index 84% rename from data/database/ce44f2cc42aa6940acfe9601377d4ce1516b5af27cf329be4c47bd3e7d1cff3b rename to data/database/eef5bed02469f1ed650258c60ef68fd81bd827a3ceb6e80c94c26b665996462d index 8c576d27a485..dd5c358047c9 100644 Binary files a/data/database/ce44f2cc42aa6940acfe9601377d4ce1516b5af27cf329be4c47bd3e7d1cff3b and b/data/database/eef5bed02469f1ed650258c60ef68fd81bd827a3ceb6e80c94c26b665996462d differ diff --git a/data/database/32bb1713870b48484231277d36a6667184bf2f0284a26757c84cfe095a183342 b/data/database/ef7781860dd7487e0e6703b54653e60d602e6ee6baef165a98d39e781b98fd36 similarity index 100% rename from data/database/32bb1713870b48484231277d36a6667184bf2f0284a26757c84cfe095a183342 rename to data/database/ef7781860dd7487e0e6703b54653e60d602e6ee6baef165a98d39e781b98fd36 diff --git a/data/database/805f47d482eda2a5b004f739411354152cfa0bb4bf5c96f223828560c61c52ca b/data/database/ef91c62b5c714b9c4e7d47d350d324ba533b7c11e6ee961f882883e73447baad similarity index 100% rename from data/database/805f47d482eda2a5b004f739411354152cfa0bb4bf5c96f223828560c61c52ca rename to data/database/ef91c62b5c714b9c4e7d47d350d324ba533b7c11e6ee961f882883e73447baad diff --git a/data/database/8903e38045568adb8a61ffde2bdc654ddfc1b50b78d5d7af3ce9729af4ade3a4 b/data/database/f0019fba6ac425e3f6ea2eb4f26ea86e26f8590ad4e421ffe19efbd98f55708e similarity index 100% rename from data/database/8903e38045568adb8a61ffde2bdc654ddfc1b50b78d5d7af3ce9729af4ade3a4 rename to data/database/f0019fba6ac425e3f6ea2eb4f26ea86e26f8590ad4e421ffe19efbd98f55708e diff --git a/data/database/331252b93c133f0d34bb32544e97efd9880dae27519269d5c21761ef319008bd b/data/database/f0c5a7ab5497c2369ce5384260932a8060c7ea00fc10850ae6c584e4fdb43e1a similarity index 99% rename from data/database/331252b93c133f0d34bb32544e97efd9880dae27519269d5c21761ef319008bd rename to data/database/f0c5a7ab5497c2369ce5384260932a8060c7ea00fc10850ae6c584e4fdb43e1a index 1f488f31a9e8..696ee4231bb4 100644 Binary files a/data/database/331252b93c133f0d34bb32544e97efd9880dae27519269d5c21761ef319008bd and b/data/database/f0c5a7ab5497c2369ce5384260932a8060c7ea00fc10850ae6c584e4fdb43e1a differ diff --git a/data/database/f1daa2afd3f9b63b6aee80faade4cf5f864b125174f6c227392bb6a65e5bcdf0 b/data/database/f1daa2afd3f9b63b6aee80faade4cf5f864b125174f6c227392bb6a65e5bcdf0 deleted file mode 100644 index ae78c30eac25..000000000000 Binary files a/data/database/f1daa2afd3f9b63b6aee80faade4cf5f864b125174f6c227392bb6a65e5bcdf0 and /dev/null differ diff --git a/data/database/f238a2f0ccc2ba2018fcf29752fb38c0c515ce3af6ee8b519bd57fd74e293eb1 b/data/database/f238a2f0ccc2ba2018fcf29752fb38c0c515ce3af6ee8b519bd57fd74e293eb1 deleted file mode 100644 index 69a51b4cd719..000000000000 Binary files a/data/database/f238a2f0ccc2ba2018fcf29752fb38c0c515ce3af6ee8b519bd57fd74e293eb1 and /dev/null differ diff --git a/data/database/25736a42b239f7f54df681725d95fbfecda4c7ac82e3ec4dddab2b76c47ae8be b/data/database/f2a56cbe89b195454a7597ed47e8d3ad854c173e54e256b80b1f893b0b9a9d62 similarity index 100% rename from data/database/25736a42b239f7f54df681725d95fbfecda4c7ac82e3ec4dddab2b76c47ae8be rename to data/database/f2a56cbe89b195454a7597ed47e8d3ad854c173e54e256b80b1f893b0b9a9d62 diff --git a/data/database/f4c7bd83601ffcaa323ab14bbb46d9d6674f32c361951914a51fabd95f554bba b/data/database/f4c7bd83601ffcaa323ab14bbb46d9d6674f32c361951914a51fabd95f554bba deleted file mode 100644 index dc8e14e78699..000000000000 Binary files a/data/database/f4c7bd83601ffcaa323ab14bbb46d9d6674f32c361951914a51fabd95f554bba and /dev/null differ diff --git a/data/database/f581d8305f6c373fe09a2fd9e5626e26d9ea70bacf03a420102a70e8a44113d3 b/data/database/f581d8305f6c373fe09a2fd9e5626e26d9ea70bacf03a420102a70e8a44113d3 deleted file mode 100644 index 118eb151a86a..000000000000 Binary files a/data/database/f581d8305f6c373fe09a2fd9e5626e26d9ea70bacf03a420102a70e8a44113d3 and /dev/null differ diff --git a/data/database/5c7f6aa328e42a7268a2083afbbb9afe6fd9d990f96b0ac188cd28a7b9247afa b/data/database/f5e9bf8ee5096b7d658766fa29dc5bf01c1e164af1f3c0986c21bc911eeef3f2 similarity index 90% rename from data/database/5c7f6aa328e42a7268a2083afbbb9afe6fd9d990f96b0ac188cd28a7b9247afa rename to data/database/f5e9bf8ee5096b7d658766fa29dc5bf01c1e164af1f3c0986c21bc911eeef3f2 index 9024be3c1aca..a75fa466540d 100644 Binary files a/data/database/5c7f6aa328e42a7268a2083afbbb9afe6fd9d990f96b0ac188cd28a7b9247afa and b/data/database/f5e9bf8ee5096b7d658766fa29dc5bf01c1e164af1f3c0986c21bc911eeef3f2 differ diff --git a/data/database/f5eeedffa0d85344fe4d7032bcd4ede6409e8f8e0aeb7dec36ce59e3c43ba2f8 b/data/database/f5eeedffa0d85344fe4d7032bcd4ede6409e8f8e0aeb7dec36ce59e3c43ba2f8 deleted file mode 100644 index 39d2f3ec936d..000000000000 Binary files a/data/database/f5eeedffa0d85344fe4d7032bcd4ede6409e8f8e0aeb7dec36ce59e3c43ba2f8 and /dev/null differ diff --git a/data/database/7ece401ccf5537f06912957165566e6a5aaad3551466aa0baade37b0df4689d9 b/data/database/f62e4e69bad23ea8941f07355b24ec46a0aa77df6339e6188c57f7f156a8e14d similarity index 100% rename from data/database/7ece401ccf5537f06912957165566e6a5aaad3551466aa0baade37b0df4689d9 rename to data/database/f62e4e69bad23ea8941f07355b24ec46a0aa77df6339e6188c57f7f156a8e14d diff --git a/data/database/f697de49af37d973df7290ab8539f22cc88545f9f5f62d73dd0118e76e670ace b/data/database/f697de49af37d973df7290ab8539f22cc88545f9f5f62d73dd0118e76e670ace deleted file mode 100644 index 8c3e36bb4ac6..000000000000 Binary files a/data/database/f697de49af37d973df7290ab8539f22cc88545f9f5f62d73dd0118e76e670ace and /dev/null differ diff --git a/data/database/5c144b2c6dd5b668aa77ac2145362ceba058c3dbf0487618354fdb09fcf2dfa7 b/data/database/f720389275cdb50edb6e3c66c30bc7ac02348244a74eb84e798cf2103a7a2b3c similarity index 100% rename from data/database/5c144b2c6dd5b668aa77ac2145362ceba058c3dbf0487618354fdb09fcf2dfa7 rename to data/database/f720389275cdb50edb6e3c66c30bc7ac02348244a74eb84e798cf2103a7a2b3c diff --git a/data/database/f7857a70fb7ee2deacd83ac2dba7b798cf032c83f61bc7387a419a99c25f284b b/data/database/f7857a70fb7ee2deacd83ac2dba7b798cf032c83f61bc7387a419a99c25f284b deleted file mode 100644 index 1d072cf89760..000000000000 Binary files a/data/database/f7857a70fb7ee2deacd83ac2dba7b798cf032c83f61bc7387a419a99c25f284b and /dev/null differ diff --git a/data/database/f7a448a0dacc0303dbd7f29e626479879b8d7bd82e9ba820b34a6459cccb162a b/data/database/f7a448a0dacc0303dbd7f29e626479879b8d7bd82e9ba820b34a6459cccb162a deleted file mode 100644 index 2326b8ea7f4e..000000000000 Binary files a/data/database/f7a448a0dacc0303dbd7f29e626479879b8d7bd82e9ba820b34a6459cccb162a and /dev/null differ diff --git a/data/database/f84a6344419960dd0e726d81c4962e6c10f2713f0cd9797dfb924e95571f90b7 b/data/database/f84a6344419960dd0e726d81c4962e6c10f2713f0cd9797dfb924e95571f90b7 deleted file mode 100644 index 8acb11fd02f3..000000000000 Binary files a/data/database/f84a6344419960dd0e726d81c4962e6c10f2713f0cd9797dfb924e95571f90b7 and /dev/null differ diff --git a/data/database/f8cadab45e552caed0ddccab530010a70277ffdfe69b21d47e1db58f55c2f32d b/data/database/f8cadab45e552caed0ddccab530010a70277ffdfe69b21d47e1db58f55c2f32d deleted file mode 100644 index 72e5a5413971..000000000000 Binary files a/data/database/f8cadab45e552caed0ddccab530010a70277ffdfe69b21d47e1db58f55c2f32d and /dev/null differ diff --git a/data/database/7eac4453e0c5f8718bef0804b3f757f138902c32d2e231b0c42365b673f63b88 b/data/database/f912dc537f67b078f3c58e728de13a2a0b3342a4f87056938c4784e779ea5702 similarity index 100% rename from data/database/7eac4453e0c5f8718bef0804b3f757f138902c32d2e231b0c42365b673f63b88 rename to data/database/f912dc537f67b078f3c58e728de13a2a0b3342a4f87056938c4784e779ea5702 diff --git a/data/database/fa0908755125e25c9515952a6b06ead5b6bfbc6e03dafda20651eff1c09f84f3 b/data/database/fa0908755125e25c9515952a6b06ead5b6bfbc6e03dafda20651eff1c09f84f3 deleted file mode 100644 index 7eb367db68ff..000000000000 Binary files a/data/database/fa0908755125e25c9515952a6b06ead5b6bfbc6e03dafda20651eff1c09f84f3 and /dev/null differ diff --git a/data/database/fbc60bf202471e5467a3a07511d6d591b87b8ce582713d917ff98d370f117cc6 b/data/database/fbc60bf202471e5467a3a07511d6d591b87b8ce582713d917ff98d370f117cc6 new file mode 100644 index 000000000000..83a8f3869039 Binary files /dev/null and b/data/database/fbc60bf202471e5467a3a07511d6d591b87b8ce582713d917ff98d370f117cc6 differ diff --git a/data/database/fcd090e4fc5282a402ca4d0d379ae7ba79477fd1d7fc6d9b839552bba9ef1e1f b/data/database/fcd090e4fc5282a402ca4d0d379ae7ba79477fd1d7fc6d9b839552bba9ef1e1f deleted file mode 100644 index 8a039af54856..000000000000 Binary files a/data/database/fcd090e4fc5282a402ca4d0d379ae7ba79477fd1d7fc6d9b839552bba9ef1e1f and /dev/null differ diff --git a/data/database/fd2383a5ddee6773bc840dea1af7492d7cbbd1e332c103537d4b5db2189a2d2b b/data/database/fd2383a5ddee6773bc840dea1af7492d7cbbd1e332c103537d4b5db2189a2d2b deleted file mode 100644 index c30ad117eb1a..000000000000 Binary files a/data/database/fd2383a5ddee6773bc840dea1af7492d7cbbd1e332c103537d4b5db2189a2d2b and /dev/null differ diff --git a/data/database/fe495af578da67954dd39c98331de3dc0b1572156f9cbd1553d04ee592ece190 b/data/database/fe495af578da67954dd39c98331de3dc0b1572156f9cbd1553d04ee592ece190 deleted file mode 100644 index 29260387f78e..000000000000 Binary files a/data/database/fe495af578da67954dd39c98331de3dc0b1572156f9cbd1553d04ee592ece190 and /dev/null differ diff --git a/discussion/app/controllers/CommentsController.scala b/discussion/app/controllers/CommentsController.scala index 499aa15b5d46..7826cd21ff98 100644 --- a/discussion/app/controllers/CommentsController.scala +++ b/discussion/app/controllers/CommentsController.scala @@ -29,7 +29,7 @@ class CommentsController( "categoryId" -> Forms.number.verifying(ReportAbuseFormValidation.validCategoryConstraint), "commentId" -> Forms.number, "reason" -> optional(Forms.text.verifying("Reason must be 250 characters or fewer", input => Constraints.maxLength(250)(input) == Valid)), - "email" -> optional(Forms.text.verifying("Please enter a valid email address", input => Constraints.emailAddress == Valid)) + "email" -> optional(Forms.text.verifying("Please enter a valid email address", input => Constraints.emailAddress()(input) == Valid)) )(DiscussionAbuseReport.apply)(DiscussionAbuseReport.unapply _) ) diff --git a/facia-press/app/frontpress/FapiFrontPress.scala b/facia-press/app/frontpress/FapiFrontPress.scala index 1d285eb64f11..3422b3b74511 100644 --- a/facia-press/app/frontpress/FapiFrontPress.scala +++ b/facia-press/app/frontpress/FapiFrontPress.scala @@ -336,10 +336,10 @@ trait FapiFrontPress extends Logging { .pageSize(0) ) - contentApiResponse.onSuccess { case _ => + contentApiResponse.foreach { _ => log.info(s"Getting SEO data from content API for $id")} - contentApiResponse.onFailure { case e: Exception => + contentApiResponse.failed.foreach { e: Throwable => log.warn(s"Error getting SEO data from content API for $id: $e") } diff --git a/facia-press/app/frontpress/FrontPressCron.scala b/facia-press/app/frontpress/FrontPressCron.scala index ee00d18f3f35..6cc7f80832a2 100644 --- a/facia-press/app/frontpress/FrontPressCron.scala +++ b/facia-press/app/frontpress/FrontPressCron.scala @@ -32,8 +32,8 @@ class FrontPressCron(liveFapiFrontPress: LiveFapiFrontPress, toolPressQueueWorke .pressByPathId(path) .map(Function.const(())) - pressFuture.onSuccess { - case _ => FrontPressCronSuccess.increment() + pressFuture.foreach { + _ => FrontPressCronSuccess.increment() } pressFuture diff --git a/facia-press/app/frontpress/JsonQueueWorker.scala b/facia-press/app/frontpress/JsonQueueWorker.scala index 1c914b72ccd5..b89f37559785 100644 --- a/facia-press/app/frontpress/JsonQueueWorker.scala +++ b/facia-press/app/frontpress/JsonQueueWorker.scala @@ -84,16 +84,18 @@ abstract class JsonQueueWorker[A: Reads]()(implicit executionContext: ExecutionC /** Ultimately, we ought to be able to recover from processing the same message twice anyway, as the nature * of SQS means you could get the same message delivered twice. */ - queue.delete(receipt) onFailure { - case error => log.error(s"Error deleting message $id from queue", error) + queue.delete(receipt).failed.foreach { + error => log.error(s"Error deleting message $id from queue", error) } consecutiveProcessingErrors.recordSuccess() case Failure(error) => if (deleteOnFailure) { - queue.delete(receipt) onFailure { - case e => log.error(s"Error deleting message $id from queue", e)}} + queue.delete(receipt).failed.foreach { + e => log.error(s"Error deleting message $id from queue", e) + } + } log.error(s"Error processing message $id", error) consecutiveProcessingErrors.recordError() } @@ -106,8 +108,8 @@ abstract class JsonQueueWorker[A: Reads]()(implicit executionContext: ExecutionC Future.successful(()) } - getRequest onFailure { - case error: Throwable => log.error("Encountered error receiving message from queue", error) + getRequest.failed.foreach { + error: Throwable => log.error("Encountered error receiving message from queue", error) } getRequest.map(_ => ()) diff --git a/facia/app/controllers/FaciaController.scala b/facia/app/controllers/FaciaController.scala index 902271f90a28..e6d821847527 100644 --- a/facia/app/controllers/FaciaController.scala +++ b/facia/app/controllers/FaciaController.scala @@ -134,7 +134,7 @@ trait FaciaController extends BaseController with Logging with ImplicitControlle ) case None => successful(Cached(CacheTime.NotFound)(WithoutRevalidationResult(NotFound)))} - futureResult.onFailure { case t: Throwable => log.error(s"Failed rendering $path with $t", t)} + futureResult.failed.foreach { t: Throwable => log.error(s"Failed rendering $path with $t", t)} futureResult } diff --git a/facia/app/controllers/HealthCheck.scala b/facia/app/controllers/HealthCheck.scala index e241d26e0604..8349ad91aea6 100644 --- a/facia/app/controllers/HealthCheck.scala +++ b/facia/app/controllers/HealthCheck.scala @@ -7,7 +7,7 @@ import services.ConfigAgent class HealthCheck(wsClient: WSClient, val controllerComponents: ControllerComponents) extends CachedHealthCheck( policy = HealthCheckPolicy.All, - preconditionMaybe = Some(HealthCheckPrecondition(ConfigAgent.isLoaded, "Facia config has not been loaded yet")) + preconditionMaybe = Some(HealthCheckPrecondition(ConfigAgent.isLoaded _, "Facia config has not been loaded yet")) )( NeverExpiresSingleHealthCheck("/uk/business") )( diff --git a/facia/test/FaciaTestData.scala b/facia/test/FaciaTestData.scala index 78536de8ddd2..728737247b4a 100644 --- a/facia/test/FaciaTestData.scala +++ b/facia/test/FaciaTestData.scala @@ -2,8 +2,9 @@ package test import java.time.ZoneOffset +import com.gu.Box import common.editions.{Au, Uk, Us} -import common.{AkkaAgent, Edition} +import common.Edition import controllers.front.Front import model.pressed.{CollectionConfig, PressedContent} import model.{PressedPage, _} @@ -265,5 +266,5 @@ trait FaciaTestData extends ModelHelper { } class TestFront extends Front with FaciaTestData { - val pageFrontAgent = AkkaAgent[Map[String, TestPageFront]](defaultAgentContents) + val pageFrontAgent = Box[Map[String, TestPageFront]](defaultAgentContents) } diff --git a/facia/test/views/fragments/nav/NavigationTest.scala b/facia/test/views/fragments/nav/NavigationTest.scala index 7f28a8dd6f8d..850dd1cd5ea8 100644 --- a/facia/test/views/fragments/nav/NavigationTest.scala +++ b/facia/test/views/fragments/nav/NavigationTest.scala @@ -6,7 +6,7 @@ import org.scalatest.{DoNotDiscover, FlatSpec, Matchers} import play.api.test.FakeRequest import test.ConfiguredTestSuite -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class NavigationTest extends FlatSpec with Matchers with ConfiguredTestSuite { @@ -22,7 +22,7 @@ import scala.collection.JavaConversions._ val currentSection = Jsoup.parseBodyFragment(tpl.toString).getElementsByClass("top-navigation__item--current") - currentSection.length shouldEqual 1 + currentSection.asScala.length shouldEqual 1 currentSection.first. getElementsByTag("a").first. @@ -41,7 +41,7 @@ import scala.collection.JavaConversions._ val currentSection = Jsoup.parseBodyFragment(tpl.toString).getElementsByClass("top-navigation__item--current") - currentSection.length shouldEqual 1 + currentSection.asScala.length shouldEqual 1 currentSection.first. getElementsByTag("a").first. diff --git a/identity/app/controllers/EditProfileController.scala b/identity/app/controllers/EditProfileController.scala index cc2586dc63f8..15a7c49d23df 100644 --- a/identity/app/controllers/EditProfileController.scala +++ b/identity/app/controllers/EditProfileController.scala @@ -222,12 +222,14 @@ case class ProfileForms( case PublicEditProfilePage => publicForm case AccountEditProfilePage => accountForm case EmailPrefsProfilePage => privacyForm + case page => throw new RuntimeException(s"Unexpected page $page") } private lazy val activeMapping = activePage match { case PublicEditProfilePage => profileFormsMapping.profileMapping case AccountEditProfilePage => profileFormsMapping.accountDetailsMapping case EmailPrefsProfilePage => profileFormsMapping.privacyMapping + case page => throw new RuntimeException(s"Unexpected page $page") } /** Fills all Edit Profile forms (Public, Account, Privacy) with the provided User value */ @@ -277,6 +279,7 @@ case class ProfileForms( case PublicEditProfilePage => copy(publicForm = changeFunc(publicForm).asInstanceOf[Form[ProfileFormData]]) case AccountEditProfilePage => copy(accountForm = changeFunc(accountForm).asInstanceOf[Form[AccountFormData]]) case EmailPrefsProfilePage => copy(privacyForm = changeFunc(privacyForm).asInstanceOf[Form[PrivacyFormData]]) + case page => throw new RuntimeException(s"Unexpected page $page") } } } diff --git a/identity/app/controllers/ExactTargetController.scala b/identity/app/controllers/ExactTargetController.scala index b47d358cb090..255cc27b2e98 100644 --- a/identity/app/controllers/ExactTargetController.scala +++ b/identity/app/controllers/ExactTargetController.scala @@ -5,7 +5,7 @@ import play.api.mvc._ import common.ImplicitControllerExecutionContext import services.{IdRequestParser, ReturnUrlVerifier} import utils.SafeLogging -import scala.collection.convert.wrapAsJava._ +import scala.collection.JavaConverters._ import conf.IdentityConfiguration import play.api.libs.ws.WSClient import exacttarget.SubscriptionDef @@ -38,7 +38,7 @@ class ExactTargetController( val parameters = subscriptionDef.parameters ++ automaticParameters val triggeredEmailRequest = - exactTargetFactory.createRequest(emailAddress, parameters, "Create", dataExtId.businessUnitId, dataExtId.customerKey) + exactTargetFactory.createRequest(emailAddress, parameters.asJava, "Create", dataExtId.businessUnitId, dataExtId.customerKey) wsClient .url(exactTargetFactory.endPoint.toString) @@ -46,9 +46,8 @@ class ExactTargetController( "Content-Type" -> "text/xml; charset=utf-8", "SOAPAction" -> triggeredEmailRequest.getSoapAction ) - .post(triggeredEmailRequest.getSoapEnvelopeString).onSuccess { - case resp => - (resp.xml \\ "CreateResponse" \ "Results") map { + .post(triggeredEmailRequest.getSoapEnvelopeString).foreach { resp => + (resp.xml \\ "CreateResponse" \ "Results") foreach { subscriberNode => val statusCode = (subscriberNode \ "StatusCode").text.trim val statusMessage = (subscriberNode \ "StatusMessage").text.trim diff --git a/identity/app/form/DateFormData.scala b/identity/app/form/DateFormData.scala index 0c5205e9d645..5174ac0d4b9c 100644 --- a/identity/app/form/DateFormData.scala +++ b/identity/app/form/DateFormData.scala @@ -1,6 +1,6 @@ package form -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ import scala.util._ import play.api.data.Forms._ import play.api.data.Mapping diff --git a/identity/app/jobs/BlockedEmailDomainList.scala b/identity/app/jobs/BlockedEmailDomainList.scala index 740888ac269d..6c13df42d810 100644 --- a/identity/app/jobs/BlockedEmailDomainList.scala +++ b/identity/app/jobs/BlockedEmailDomainList.scala @@ -1,11 +1,12 @@ package jobs -import common.{AkkaAgent, Logging} +import com.gu.Box +import common.Logging import services.S3Infosec object BlockedEmailDomainList extends Logging { - private val blockedDomainAgent = AkkaAgent[Set[String]](Set.empty) + private val blockedDomainAgent = Box[Set[String]](Set.empty) def run () { log.info("Updating email blocked domains list") diff --git a/identity/app/jobs/TorExitNodeList.scala b/identity/app/jobs/TorExitNodeList.scala index a0bcc1c43963..6fec4abf6fbd 100644 --- a/identity/app/jobs/TorExitNodeList.scala +++ b/identity/app/jobs/TorExitNodeList.scala @@ -1,13 +1,17 @@ package jobs -import common.{Logging, AkkaAgent} -import scala.collection.JavaConversions._ -import java.net.{URL, InetAddress} +import common.Logging + +import scala.collection.JavaConverters._ +import java.net.{InetAddress, URL} + +import com.gu.Box + import scala.io.Source object TorExitNodeList extends Logging { - private val torExitNodeAgent = AkkaAgent[Set[String]](Set.empty) + private val torExitNodeAgent = Box[Set[String]](Set.empty) private val torNodeListUrl = "https://check.torproject.org/cgi-bin/TorBulkExitList.py" def run() { diff --git a/onward/app/feed/MostPopularAgent.scala b/onward/app/feed/MostPopularAgent.scala index e511ddc46043..a761398b3d90 100644 --- a/onward/app/feed/MostPopularAgent.scala +++ b/onward/app/feed/MostPopularAgent.scala @@ -1,9 +1,11 @@ package feed +import com.gu.Box import contentapi.ContentApiClient import common._ import services.OphanApi import model.RelatedContentItem + import scala.concurrent.{ExecutionContext, Future} object MostPopularRefresh { @@ -23,7 +25,7 @@ object MostPopularRefresh { class MostPopularAgent(contentApiClient: ContentApiClient) extends Logging { - private val agent = AkkaAgent[Map[String, Seq[RelatedContentItem]]](Map.empty) + private val agent = Box[Map[String, Seq[RelatedContentItem]]](Map.empty) def mostPopular(edition: Edition): Seq[RelatedContentItem] = agent().getOrElse(edition.id, Nil) @@ -46,7 +48,7 @@ case class Country(code: String, edition: Edition) class GeoMostPopularAgent(contentApiClient: ContentApiClient, ophanApi: OphanApi) extends Logging { - private val ophanPopularAgent = AkkaAgent[Map[String, Seq[RelatedContentItem]]](Map.empty) + private val ophanPopularAgent = Box[Map[String, Seq[RelatedContentItem]]](Map.empty) private val defaultCountry: Country = Country("row", Edition.defaultEdition) @@ -87,7 +89,7 @@ class GeoMostPopularAgent(contentApiClient: ContentApiClient, ophanApi: OphanApi class DayMostPopularAgent(contentApiClient: ContentApiClient, ophanApi: OphanApi) extends Logging { - private val ophanPopularAgent = AkkaAgent[Map[String, Seq[RelatedContentItem]]](Map.empty) + private val ophanPopularAgent = Box[Map[String, Seq[RelatedContentItem]]](Map.empty) private val countries = Seq( Country("GB", editions.Uk), diff --git a/onward/app/feed/MostReadAgent.scala b/onward/app/feed/MostReadAgent.scala index e8f828875aa4..f11979c2166d 100644 --- a/onward/app/feed/MostReadAgent.scala +++ b/onward/app/feed/MostReadAgent.scala @@ -1,12 +1,14 @@ package feed +import com.gu.Box import common._ import services.OphanApi + import scala.concurrent.{ExecutionContext, Future} class MostReadAgent(ophanApi: OphanApi) extends Logging { - private val agent = AkkaAgent[Map[String, Int]](Map.empty) + private val agent = Box[Map[String, Int]](Map.empty) def refresh()(implicit ec: ExecutionContext): Future[Map[String, Int]] = { log.info("Refreshing most read.") diff --git a/onward/app/feed/MostViewedAudioAgent.scala b/onward/app/feed/MostViewedAudioAgent.scala index 6d42dbadd32b..4c9361f547d0 100644 --- a/onward/app/feed/MostViewedAudioAgent.scala +++ b/onward/app/feed/MostViewedAudioAgent.scala @@ -1,15 +1,17 @@ package feed +import com.gu.Box import contentapi.ContentApiClient import common._ import model.RelatedContentItem + import scala.concurrent.{ExecutionContext, Future} import services.OphanApi class MostViewedAudioAgent(contentApiClient: ContentApiClient, ophanApi: OphanApi) extends Logging { - private val audioAgent = AkkaAgent[Seq[RelatedContentItem]](Nil) - private val podcastAgent = AkkaAgent[Seq[RelatedContentItem]](Nil) + private val audioAgent = Box[Seq[RelatedContentItem]](Nil) + private val podcastAgent = Box[Seq[RelatedContentItem]](Nil) def mostViewedAudio(): Seq[RelatedContentItem] = audioAgent() def mostViewedPodcast(): Seq[RelatedContentItem] = podcastAgent() diff --git a/onward/app/feed/MostViewedGalleryAgent.scala b/onward/app/feed/MostViewedGalleryAgent.scala index 88ee9a7e5514..5967c6e8e7c2 100644 --- a/onward/app/feed/MostViewedGalleryAgent.scala +++ b/onward/app/feed/MostViewedGalleryAgent.scala @@ -1,14 +1,16 @@ package feed +import com.gu.Box import contentapi.ContentApiClient import common._ import model.RelatedContentItem + import scala.concurrent.{ExecutionContext, Future} import services.OphanApi class MostViewedGalleryAgent(contentApiClient: ContentApiClient, ophanApi: OphanApi) extends Logging { - private val agent = AkkaAgent[Seq[RelatedContentItem]](Nil) + private val agent = Box[Seq[RelatedContentItem]](Nil) def mostViewedGalleries(): Seq[RelatedContentItem] = agent() diff --git a/onward/app/feed/MostViewedVideoAgent.scala b/onward/app/feed/MostViewedVideoAgent.scala index a5da5ab0db1a..aa014b7fdb94 100644 --- a/onward/app/feed/MostViewedVideoAgent.scala +++ b/onward/app/feed/MostViewedVideoAgent.scala @@ -1,5 +1,6 @@ package feed +import com.gu.Box import com.gu.contentapi.client import common._ import common.editions.Uk @@ -7,13 +8,14 @@ import contentapi.ContentApiClient import model.{Video, _} import play.api.libs.json._ import services.OphanApi + import scala.concurrent.{ExecutionContext, Future} class MostViewedVideoAgent(contentApiClient: ContentApiClient, ophanApi: OphanApi) extends Logging { case class QueryResult(id: String, count: Double, paths: Seq[String]) - private val agent = AkkaAgent[Seq[Video]](Nil) + private val agent = Box[Seq[Video]](Nil) implicit val ophanQueryReads = Json.reads[QueryResult] diff --git a/onward/test/MostPopularFeatureTest.scala b/onward/test/MostPopularFeatureTest.scala index 391dceba020b..63515e1f92d3 100644 --- a/onward/test/MostPopularFeatureTest.scala +++ b/onward/test/MostPopularFeatureTest.scala @@ -1,7 +1,7 @@ package test import org.scalatest.{DoNotDiscover, Matchers, GivenWhenThen, FeatureSpec} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class MostPopularFeatureTest extends FeatureSpec with GivenWhenThen with Matchers with ConfiguredTestSuite { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 6b41de41d853..a45a63054e26 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -3,15 +3,16 @@ package com.gu import sbt._ object Dependencies { - val identityLibVersion = "3.83" + val identityLibVersion = "3.84" val awsVersion = "1.11.181" val faciaVersion = "2.5.0" val capiVersion = "11.40" + val dispatchVersion = "0.13.1" val romeVersion = "1.0" val jerseyVersion = "1.19.4" val playJsonVersion = "2.6.3" - val akkaAgent = "com.typesafe.akka" %% "akka-agent" % "2.3.4" - val akkaContrib = "com.typesafe.akka" %% "akka-contrib" % "2.3.16" + val guBox = "com.gu" %% "box" % "0.1.0" + val akkaContrib = "com.typesafe.akka" %% "akka-contrib" % "2.5.6" val apacheCommonsMath3 = "org.apache.commons" % "commons-math3" % "3.6.1" val awsCore = "com.amazonaws" % "aws-java-sdk-core" % awsVersion val awsCloudwatch = "com.amazonaws" % "aws-java-sdk-cloudwatch" % awsVersion @@ -30,9 +31,9 @@ object Dependencies { val cssParser = "net.sourceforge.cssparser" % "cssparser" % "0.9.23" val contentApiClient = "com.gu" %% "content-api-client" % capiVersion val dfpAxis = "com.google.api-ads" % "dfp-axis" % "3.7.0" - val exactTargetClient = "com.gu" %% "exact-target-client" % "2.24" + val exactTargetClient = "com.gu" %% "exact-target-client" % "2.26" val faciaFapiScalaClient = "com.gu" %% "fapi-client-play26" % faciaVersion - val configMagic = "com.gu" %% "configuration-magic-core" % "1.3.0" + val configMagic = "com.gu" %% "configuration-magic-core" % "1.4.0" val identityCookie = "com.gu.identity" %% "identity-cookie" % identityLibVersion val identityModel = "com.gu.identity" %% "identity-model" % identityLibVersion val identityRequest = "com.gu.identity" %% "identity-request" % identityLibVersion @@ -40,18 +41,18 @@ object Dependencies { val jodaTime = "joda-time" % "joda-time" % "2.9.9" val jodaConvert = "org.joda" % "joda-convert" % "1.8.3" val jSoup = "org.jsoup" % "jsoup" % "1.10.3" - val liftJson = "net.liftweb" %% "lift-json" % "2.6-RC2" + val liftJson = "net.liftweb" %% "lift-json" % "3.1.1" val json4s = "org.json4s" %% "json4s-native" % "3.5.3" val macwire = "com.softwaremill.macwire" %% "macros" % "2.3.0" % "provided" val mockito = "org.mockito" % "mockito-all" % "1.10.19" % Test - val paClient = "com.gu" %% "pa-client" % "6.0.3" + val paClient = "com.gu" %% "pa-client" % "6.1.0" val playGoogleAuth = "com.gu" %% "play-googleauth" % "0.7.0" val quartzScheduler = "org.quartz-scheduler" % "quartz" % "2.2.3" val redisClient = "net.debasishg" %% "redisclient" % "3.4" val rome = "rome" % "rome" % romeVersion val romeModules = "org.rometools" % "rome-modules" % romeVersion val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.13.5" % Test - val scalajTime = "org.scalaj" % "scalaj-time_2.10.2" % "0.7" + val nScalaTime = "com.github.nscala-time" %% "nscala-time" % "2.18.0" val scalaTest = "org.scalatest" %% "scalatest" % "3.0.4" % Test val scalaTestPlus = "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.1" % Test val scalaUri = "com.netaporter" %% "scala-uri" % "0.4.16" @@ -63,9 +64,9 @@ object Dependencies { val libPhoneNumber = "com.googlecode.libphonenumber" % "libphonenumber" % "7.2.4" val logback = "net.logstash.logback" % "logstash-logback-encoder" % "4.6" val kinesisLogbackAppender = "com.gu" % "kinesis-logback-appender" % "1.4.0" - val targetingClient = "com.gu" %% "targeting-client" % "0.14.0" + val targetingClient = "com.gu" %% "targeting-client-play26" % "0.14.1" val scanamo = "com.gu" %% "scanamo" % "0.9.5" - val enumeratumPlayJson = "com.beachape" %% "enumeratum-play-json" % "1.5.11" + val enumeratumPlayJson = "com.beachape" %% "enumeratum-play-json" % "1.5.12" val commercialShared = "com.gu" %% "commercial-shared" % "6.1.2" val playJson = "com.typesafe.play" %% "play-json" % playJsonVersion val playJsonJoda = "com.typesafe.play" %% "play-json-joda" % playJsonVersion diff --git a/project/ProjectSettings.scala b/project/ProjectSettings.scala index 7e77fdaaabf5..f2d4f30bc375 100644 --- a/project/ProjectSettings.scala +++ b/project/ProjectSettings.scala @@ -21,12 +21,12 @@ object ProjectSettings { maxErrors := 20, javacOptions := Seq("-g","-encoding", "utf8"), scalacOptions := Seq("-unchecked", "-deprecation", "-target:jvm-1.8", - "-Xcheckinit", "-encoding", "utf8", "-feature", "-Yinline-warnings","-Xfatal-warnings"), + "-Xcheckinit", "-encoding", "utf8", "-feature","-Xfatal-warnings"), publishArtifact in (Compile, packageDoc) := false, sources in (Compile,doc) := Seq.empty, doc in Compile := target.map(_ / "none").value, incOptions := incOptions.value.withNameHashing(true), - scalaVersion := "2.11.11", + scalaVersion := "2.12.4", initialize := { val _ = initialize.value assert(sys.props("java.specification.version") == "1.8", diff --git a/sport/app/cricket/jobs/CricketStatsJob.scala b/sport/app/cricket/jobs/CricketStatsJob.scala index 6b0e627324ea..d86e81853b84 100644 --- a/sport/app/cricket/jobs/CricketStatsJob.scala +++ b/sport/app/cricket/jobs/CricketStatsJob.scala @@ -1,6 +1,7 @@ package jobs -import common.{AkkaAgent, Logging} +import com.gu.Box +import common.Logging import conf.cricketPa.{CricketFeedException, CricketTeam, CricketTeams, PaFeed} import cricketModel.Match import org.joda.time.{DateTimeZone, Days, LocalDate} @@ -10,7 +11,7 @@ import scala.concurrent.ExecutionContext class CricketStatsJob(paFeed: PaFeed) extends Logging { - private val cricketStatsAgents = CricketTeams.teams.map(Team => (Team, AkkaAgent[Map[String, Match]](Map.empty))) + private val cricketStatsAgents = CricketTeams.teams.map(Team => (Team, Box[Map[String, Match]](Map.empty))) private val dateFormatUTC = DateTimeFormat.forPattern("yyyy/MMM/dd").withZone(DateTimeZone.UTC) diff --git a/sport/app/football/conf/context.scala b/sport/app/football/conf/context.scala index 5645cbd2025e..4559b41a5c1a 100644 --- a/sport/app/football/conf/context.scala +++ b/sport/app/football/conf/context.scala @@ -63,7 +63,7 @@ class FootballLifecycle( akkaAsync.after1s { val competitionUpdate = competitionsService.refreshCompetitionData() - competitionUpdate.onSuccess { case _ => competitionsService.competitionIds.foreach(competitionsService.refreshCompetitionAgent) } + competitionUpdate.foreach { _ => competitionsService.competitionIds.foreach(competitionsService.refreshCompetitionAgent) } competitionsService.refreshMatchDay() TeamMap.refresh()(contentApiClient, ec) } diff --git a/sport/app/football/controllers/MoreOnMatchController.scala b/sport/app/football/controllers/MoreOnMatchController.scala index df353ff0ef5d..2ad4aef1eb7d 100644 --- a/sport/app/football/controllers/MoreOnMatchController.scala +++ b/sport/app/football/controllers/MoreOnMatchController.scala @@ -10,8 +10,8 @@ import model.Cached.{RevalidatableResult, WithoutRevalidationResult} import model.{Cached, Content, ContentType} import org.joda.time.LocalDate import org.joda.time.format.DateTimeFormat -import org.scala_tools.time.Imports -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports +import com.github.nscala_time.time.Imports._ import pa.FootballMatch import play.api.libs.json._ import play.api.mvc._ diff --git a/sport/app/football/feed/Competitions.scala b/sport/app/football/feed/Competitions.scala index 7ab686fb0a06..fd5cb5c93d07 100644 --- a/sport/app/football/feed/Competitions.scala +++ b/sport/app/football/feed/Competitions.scala @@ -6,7 +6,7 @@ import java.util.Comparator import model.{Competition, Table, TeamFixture, TeamNameBuilder} import org.joda.time.{DateTimeComparator, LocalDate} -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ import pa._ import scala.collection.immutable @@ -52,7 +52,7 @@ trait Competitions extends implicits.Football { -(group.map(_.entries.length) getOrElse competition.leagueTable.length) }).headOption - lazy val matchDates = competitions.flatMap(_.matchDates).distinct.sorted + lazy val matchDates = competitions.flatMap(_.matchDates).distinct.sorted(localDateOrdering) def nextMatchDates(startDate: LocalDate, numDays: Int): Seq[LocalDate] = matchDates.filter(_ >= startDate).take(numDays) diff --git a/sport/app/football/feed/agent.scala b/sport/app/football/feed/agent.scala index 0d49ad65014a..842751656168 100644 --- a/sport/app/football/feed/agent.scala +++ b/sport/app/football/feed/agent.scala @@ -1,5 +1,6 @@ package feed +import com.gu.Box import pa._ import conf.FootballClient import org.joda.time.LocalDate @@ -104,7 +105,7 @@ trait Results extends Logging with implicits.Collections { class CompetitionAgent(val footballClient: FootballClient, val teamNameBuilder: TeamNameBuilder, _competition: Competition) extends Fixtures with Results with LeagueTables with implicits.Football { - private lazy val agent = AkkaAgent(_competition) + private lazy val agent = Box(_competition) def competition: Competition = agent() diff --git a/sport/app/football/model/TeamMap.scala b/sport/app/football/model/TeamMap.scala index a714eb878fd8..4147d5ceb472 100644 --- a/sport/app/football/model/TeamMap.scala +++ b/sport/app/football/model/TeamMap.scala @@ -3,6 +3,7 @@ package model import common._ import contentapi.ContentApiClient import _root_.feed.Competitions +import com.gu.Box import pa._ import scala.concurrent.ExecutionContext @@ -15,7 +16,7 @@ case class Team(team: FootballTeam, tag: Option[Tag], shortName: Option[String]) object TeamMap extends Logging { - val teamAgent = AkkaAgent(Map.empty[String, Tag]) + val teamAgent = Box(Map.empty[String, Tag]) // teamId -> manually curated short name val shortNames = Map( diff --git a/sport/app/rugby/jobs/RugbyStatsJob.scala b/sport/app/rugby/jobs/RugbyStatsJob.scala index e1f4dfccd971..187d56f54578 100644 --- a/sport/app/rugby/jobs/RugbyStatsJob.scala +++ b/sport/app/rugby/jobs/RugbyStatsJob.scala @@ -1,6 +1,7 @@ package rugby.jobs -import common.{AkkaAgent, Logging} +import com.gu.Box +import common.Logging import org.joda.time.format.{DateTimeFormat, DateTimeFormatter} import rugby.model._ import rugby.feed.{MatchNavigation, OptaEvent, OptaFeed, RugbyOptaFeedException} @@ -12,11 +13,11 @@ import scala.util.Success class RugbyStatsJob(optaFeed: OptaFeed) extends Logging { - protected val fixturesAndResultsMatches = AkkaAgent[Map[String, Match]](Map.empty) - protected val matchNavContent = AkkaAgent[Map[String, MatchNavigation]](Map.empty) - protected val pastScoreEvents = AkkaAgent[Map[String, Seq[ScoreEvent]]](Map.empty) - protected val pastMatchesStat = AkkaAgent[Map[String, MatchStat]](Map.empty) - protected val groupTables = AkkaAgent[Map[OptaEvent, Seq[GroupTable]]](Map.empty) + protected val fixturesAndResultsMatches = Box[Map[String, Match]](Map.empty) + protected val matchNavContent = Box[Map[String, MatchNavigation]](Map.empty) + protected val pastScoreEvents = Box[Map[String, Seq[ScoreEvent]]](Map.empty) + protected val pastMatchesStat = Box[Map[String, MatchStat]](Map.empty) + protected val groupTables = Box[Map[OptaEvent, Seq[GroupTable]]](Map.empty) val dateFormat: DateTimeFormatter = DateTimeFormat.forPattern("yyyy/MM/dd") diff --git a/sport/test/FixturesFeatureTest.scala b/sport/test/FixturesFeatureTest.scala index 04d260dfcdc7..3a28956abffc 100644 --- a/sport/test/FixturesFeatureTest.scala +++ b/sport/test/FixturesFeatureTest.scala @@ -1,7 +1,7 @@ package test import org.scalatest.{DoNotDiscover, FeatureSpec, GivenWhenThen, Matchers} -import collection.JavaConversions._ +import collection.JavaConverters._ import tools.MatchListFeatureTools @DoNotDiscover class FixturesFeatureTest extends FeatureSpec with GivenWhenThen with Matchers with MatchListFeatureTools with ConfiguredTestSuite { @@ -46,7 +46,7 @@ import tools.MatchListFeatureTools goTo("/football/fixtures/2012/oct/20") { browser => import browser._ Then("any links I click should be tracked") - $("a").filter(link => Option(link.attribute("data-link-name")).isEmpty).foreach { link => + $("a").asScala.filter(link => Option(link.attribute("data-link-name")).isEmpty).foreach { link => fail(s"Link with text ${link.text} has no data-link-name") } } diff --git a/sport/test/FootballTestData.scala b/sport/test/FootballTestData.scala index 415b876f965f..56fd46097678 100644 --- a/sport/test/FootballTestData.scala +++ b/sport/test/FootballTestData.scala @@ -4,7 +4,7 @@ import conf.FootballClient import feed.CompetitionsService import model.{Competition, Tag, TagProperties, TeamMap} import org.joda.time.DateTime -import org.scala_tools.time.Imports._ +import com.github.nscala_time.time.Imports._ import pa._ trait FootballTestData { diff --git a/sport/test/MatchFeatureTest.scala b/sport/test/MatchFeatureTest.scala index 211140fe2911..dd2ac3f54507 100644 --- a/sport/test/MatchFeatureTest.scala +++ b/sport/test/MatchFeatureTest.scala @@ -2,7 +2,7 @@ package test import org.scalatest.{DoNotDiscover, FeatureSpec, GivenWhenThen, Matchers} -import scala.collection.JavaConversions._ +import scala.collection.JavaConverters._ @DoNotDiscover class MatchFeatureTest extends FeatureSpec @@ -19,7 +19,7 @@ import scala.collection.JavaConversions._ goTo("/football/match/3834132") { browser => import browser._ - val teamsAndScore = $("h2").texts.map(_.replaceAll("\n", " ")) + val teamsAndScore = $("h2").texts.asScala.map(_.replaceAll("\n", " ")) Then("I should see the home team score") teamsAndScore should contain("Stoke 1") @@ -54,7 +54,7 @@ import scala.collection.JavaConversions._ el(".team-list").text should include("Mame Diouf") And("I should see the away team lineup") - $(".team-list")(1).text should include("Gabriel Agbonlahor") + $(".team-list").asScala(1).text should include("Gabriel Agbonlahor") } } } diff --git a/sport/test/ResultsFeatureTest.scala b/sport/test/ResultsFeatureTest.scala index f972748d35f7..c15f8e82c435 100644 --- a/sport/test/ResultsFeatureTest.scala +++ b/sport/test/ResultsFeatureTest.scala @@ -1,7 +1,7 @@ package test import org.scalatest.{DoNotDiscover, FeatureSpec, GivenWhenThen, Matchers} -import collection.JavaConversions._ +import collection.JavaConverters._ import tools.MatchListFeatureTools @DoNotDiscover class ResultsFeatureTest extends FeatureSpec with GivenWhenThen with Matchers with MatchListFeatureTools with ConfiguredTestSuite { @@ -35,7 +35,7 @@ import tools.MatchListFeatureTools $(".football-team__form").size() should be(0) Then("I should see match comments") - $(".football-match__comments").texts.exists(_.contains("Bolton win 4-2 on penalties")) should equal(true) + $(".football-match__comments").texts.asScala.exists(_.contains("Bolton win 4-2 on penalties")) should equal(true) } } @@ -82,7 +82,7 @@ import tools.MatchListFeatureTools goTo("/football/results") { browser => import browser._ Then("any links I click should be tracked") - $("a").filter(link => Option(link.attribute("data-link-name")).isEmpty).foreach { link => + $("a").asScala.filter(link => Option(link.attribute("data-link-name")).isEmpty).foreach { link => fail(s"Link with text ${link.text} has no data-link-name") } } diff --git a/sport/test/tools/MatchListFeatureTools.scala b/sport/test/tools/MatchListFeatureTools.scala index 15893ab7da23..8df6eacc9ba9 100644 --- a/sport/test/tools/MatchListFeatureTools.scala +++ b/sport/test/tools/MatchListFeatureTools.scala @@ -3,23 +3,23 @@ package tools import org.fluentlenium.core.domain.{FluentWebElement, FluentList} import org.openqa.selenium.interactions.Actions import play.api.test.TestBrowser -import collection.JavaConversions._ +import collection.JavaConverters._ import org.scalatest.Matchers trait MatchListFeatureTools extends Matchers { protected def assertTeamWithScore(matches: FluentList[FluentWebElement], team: String, score: String): Unit = { - val matchesStr = matches.map(matchEl => matchEl.find(".football-team__name").text + " - " + matchEl.find(".football-team__score").text) + val matchesStr = matches.asScala.map(matchEl => matchEl.find(".football-team__name").text + " - " + matchEl.find(".football-team__score").text) assert( - matches.exists { matchEl => + matches.asScala.exists { matchEl => matchEl.find(".football-team__name").text == team && matchEl.find(".football-team__score").text == score }, s"$matchesStr did not contain $team - $score" ) } protected def assertNotTeamWithScore(matches: FluentList[FluentWebElement], team: String, score: String): Unit = { - val matchesStr = matches.map(matchEl => matchEl.find(".football-team__name").text + " - " + matchEl.find(".football-team__score").text) + val matchesStr = matches.asScala.map(matchEl => matchEl.find(".football-team__name").text + " - " + matchEl.find(".football-team__score").text) assert( - !matches.exists { matchEl => + !matches.asScala.exists { matchEl => matchEl.find(".football-team__name").text == team && matchEl.find(".football-team__score").text == score }, s"$matchesStr erroneously contained $team - $score" @@ -27,9 +27,9 @@ trait MatchListFeatureTools extends Matchers { } protected def assertFixture(matches: FluentList[FluentWebElement], team1: String, team2: String): Unit = { - val matchesStr = matches.map(matchEl => matchEl.find(".football-team__name").texts) + val matchesStr = matches.asScala.map(matchEl => matchEl.find(".football-team__name").texts) assert( - matches.exists { matchEl => + matches.asScala.exists { matchEl => val texts = matchEl.find(".football-team__name").texts texts.size should equal(2) texts.contains(team1) && texts.contains(team2) @@ -38,9 +38,9 @@ trait MatchListFeatureTools extends Matchers { ) } protected def assertNotFixture(matches: FluentList[FluentWebElement], team1: String, team2: String): Unit = { - val matchesStr = matches.map(matchEl => matchEl.find(".football-team__name").texts) + val matchesStr = matches.asScala.map(matchEl => matchEl.find(".football-team__name").texts) assert( - !matches.exists { matchEl => + !matches.asScala.exists { matchEl => val texts = matchEl.find(".football-team__name").texts texts.size should equal(2) texts.contains(team1) && texts.contains(team2)