From 47ab929d4b6193695c35283b222dabb621e44968 Mon Sep 17 00:00:00 2001 From: Rustan Leino Date: Mon, 22 Jan 2024 05:52:17 -0800 Subject: [PATCH] fix: Check for correct use of type characteristics in ghosts and default expressions (#4928) This PR adds checks for correct instantiations of type parameters that were previously missing. Previously, these checks were only done in non-ghost expressions (historically, it seems the code that performs these checks was designed for checking `(==)`, which applies only in ghost expressions). This PR adds the checks also specifications (which are ghost) and default expressions for parameters). The new test file `git-issue-4926.dfy` reports 38 errors, whereas before this PR, Dafny reported only 8. It also extracts the code for these checks into a separate file, `TypeCharacteristicChecker.cs` (in addition to the existing file `CheckTypeCharacteristics_Visitor`). Fixes #4926 By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --------- Co-authored-by: Stefan Zetzsche <120379523+stefan-aws@users.noreply.github.com> --- Source/DafnyCore/Resolver/ModuleResolver.cs | 289 +--------------- .../Resolver/TypeCharacteristicChecker.cs | 319 ++++++++++++++++++ .../binaries/DafnyStandardLibraries-cs.doo | Bin 1340 -> 1340 bytes .../binaries/DafnyStandardLibraries-go.doo | Bin 1360 -> 1360 bytes .../binaries/DafnyStandardLibraries-java.doo | Bin 1321 -> 1321 bytes .../binaries/DafnyStandardLibraries-js.doo | Bin 1867 -> 1867 bytes .../DafnyStandardLibraries-notarget.doo | Bin 1314 -> 1314 bytes .../binaries/DafnyStandardLibraries-py.doo | Bin 1331 -> 1331 bytes .../binaries/DafnyStandardLibraries.doo | Bin 56961 -> 56908 bytes .../src/Std/Collections/Array.dfy | 2 +- .../src/Std/Collections/Seq.dfy | 107 +++--- .../src/Std/JSON/Utils/Views.dfy | 2 +- .../src/Std/Relations.dfy | 6 +- .../LitTest/dafny0/TypeParameters.dfy | 2 +- .../LitTest/dafny4/ACL2-extractor.dfy | 2 +- .../LitTest/dafny4/ExpandedGuardedness.dfy | 4 +- .../LitTest/git-issues/git-issue-4926.dfy | 95 ++++++ .../git-issues/git-issue-4926.dfy.expect | 39 +++ .../LitTests/LitTest/hofs/Folding.dfy | 10 +- docs/dev/news/4928.fix | 1 + 20 files changed, 521 insertions(+), 357 deletions(-) create mode 100644 Source/DafnyCore/Resolver/TypeCharacteristicChecker.cs create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy create mode 100644 Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy.expect create mode 100644 docs/dev/news/4928.fix diff --git a/Source/DafnyCore/Resolver/ModuleResolver.cs b/Source/DafnyCore/Resolver/ModuleResolver.cs index e379440d05..c9188e490f 100644 --- a/Source/DafnyCore/Resolver/ModuleResolver.cs +++ b/Source/DafnyCore/Resolver/ModuleResolver.cs @@ -1348,108 +1348,14 @@ void CheckIfCompilable(RedirectingTypeDecl declWithConstraint) { } } - InferEqualitySupport(declarations); + TypeCharacteristicChecker.InferAndCheck(declarations, isAnExport, reporter); // Check that functions claiming to be abstemious really are, and check that 'older' parameters are used only when allowed foreach (var fn in ModuleDefinition.AllFunctions(declarations)) { new Abstemious(reporter).Check(fn); CheckOlderParameters(fn); } - // Check that all == and != operators in non-ghost contexts are applied to equality-supporting types. - // Note that this check can only be done after determining which expressions are ghosts. - foreach (var d in declarations) { - for (var attr = d.Attributes; attr != null; attr = attr.Prev) { - attr.Args.ForEach(e => CheckTypeCharacteristics_Expr(e, true)); - } - - if (d is IteratorDecl) { - var iter = (IteratorDecl)d; - foreach (var p in iter.Ins) { - CheckTypeCharacteristics_Type(p.tok, p.Type, p.IsGhost); - } - foreach (var p in iter.Outs) { - CheckTypeCharacteristics_Type(p.tok, p.Type, p.IsGhost); - } - if (iter.Body != null) { - CheckTypeCharacteristics_Stmt(iter.Body, false); - } - } else if (d is ClassLikeDecl) { - var cl = (TopLevelDeclWithMembers)d; - foreach (var parentTrait in cl.ParentTraits) { - CheckTypeCharacteristics_Type(cl.tok, parentTrait, false); - } - } else if (d is DatatypeDecl) { - var dt = (DatatypeDecl)d; - foreach (var ctor in dt.Ctors) { - foreach (var p in ctor.Formals) { - CheckTypeCharacteristics_Type(p.tok, p.Type, p.IsGhost); - } - } - } else if (d is TypeSynonymDecl) { - var syn = (TypeSynonymDecl)d; - CheckTypeCharacteristics_Type(syn.tok, syn.Rhs, false); - if (!isAnExport) { - if (syn.SupportsEquality && !syn.Rhs.SupportsEquality) { - reporter.Error(MessageSource.Resolver, syn.tok, "type '{0}' declared as supporting equality, but the RHS type ({1}) might not", - syn.Name, syn.Rhs); - } - if (syn.Characteristics.IsNonempty && !syn.Rhs.IsNonempty) { - reporter.Error(MessageSource.Resolver, syn.tok, "type '{0}' declared as being nonempty, but the RHS type ({1}) may be empty", - syn.Name, syn.Rhs); - } else if (syn.Characteristics.HasCompiledValue && !syn.Rhs.HasCompilableValue) { - reporter.Error(MessageSource.Resolver, syn.tok, - "type '{0}' declared as auto-initialization type, but the RHS type ({1}) does not support auto-initialization", syn.Name, syn.Rhs); - } - if (syn.Characteristics.ContainsNoReferenceTypes && syn.Rhs.MayInvolveReferences) { - reporter.Error(MessageSource.Resolver, syn.tok, - "type '{0}' declared as containing no reference types, but the RHS type ({1}) may contain reference types", syn.Name, syn.Rhs); - } - } - } - - if (d is RedirectingTypeDecl) { - var rtd = (RedirectingTypeDecl)d; - if (rtd.Constraint != null) { - CheckTypeCharacteristics_Expr(rtd.Constraint, true); - } - if (rtd.Witness != null) { - CheckTypeCharacteristics_Expr(rtd.Witness, rtd.WitnessKind == SubsetTypeDecl.WKind.Ghost); - } - } - if (d is TopLevelDeclWithMembers) { - var cl = (TopLevelDeclWithMembers)d; - foreach (var member in cl.Members) { - if (member is Field) { - var f = (Field)member; - CheckTypeCharacteristics_Type(f.tok, f.Type, f.IsGhost); - if (f is ConstantField cf && cf.Rhs != null) { - CheckTypeCharacteristics_Expr(cf.Rhs, cf.IsGhost); - } - } else if (member is Function) { - var f = (Function)member; - foreach (var p in f.Formals) { - CheckTypeCharacteristics_Type(p.tok, p.Type, f.IsGhost || p.IsGhost); - } - CheckTypeCharacteristics_Type(f.Result?.tok ?? f.tok, f.ResultType, f.IsGhost); - if (f.Body != null) { - CheckTypeCharacteristics_Expr(f.Body, f.IsGhost); - } - } else if (member is Method) { - var m = (Method)member; - foreach (var p in m.Ins) { - CheckTypeCharacteristics_Type(p.tok, p.Type, m.IsGhost || p.IsGhost); - } - foreach (var p in m.Outs) { - CheckTypeCharacteristics_Type(p.tok, p.Type, m.IsGhost || p.IsGhost); - } - if (m.Body != null) { - CheckTypeCharacteristics_Stmt(m.Body, m.IsGhost); - } - } - } - } - } // Check that extreme predicates are not recursive with non-extreme-predicate functions (and only // with extreme predicates of the same polarity), and // check that greatest lemmas are not recursive with non-greatest-lemma methods. @@ -1658,139 +1564,6 @@ void CheckIfCompilable(RedirectingTypeDecl declWithConstraint) { } } - /// - /// Inferred required equality support for datatypes and type synonyms, and for Function and Method signatures. - /// - /// - private void InferEqualitySupport(List declarations) { - /// First, do datatypes and type synonyms until a fixpoint is reached. - bool inferredSomething; - do { - inferredSomething = false; - foreach (var d in declarations) { - if (Attributes.Contains(d.Attributes, "_provided")) { - // Don't infer required-equality-support for the type parameters, since there are - // scopes that see the name of the declaration but not its body. - } else if (d is DatatypeDecl) { - var dt = (DatatypeDecl)d; - foreach (var tp in dt.TypeArgs) { - if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { - // here's our chance to infer the need for equality support - foreach (var ctor in dt.Ctors) { - foreach (var arg in ctor.Formals) { - if (InferRequiredEqualitySupport(tp, arg.Type)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - inferredSomething = true; - goto DONE_DT; // break out of the doubly-nested loop - } - } - } - DONE_DT:; - } - } - } else if (d is TypeSynonymDecl) { - var syn = (TypeSynonymDecl)d; - foreach (var tp in syn.TypeArgs) { - if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { - // here's our chance to infer the need for equality support - if (InferRequiredEqualitySupport(tp, syn.Rhs)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - inferredSomething = true; - } - } - } - } - } - } while (inferredSomething); - - // Now do it for Function and Method signatures. - foreach (var d in declarations) { - if (d is IteratorDecl) { - var iter = (IteratorDecl)d; - var done = false; - var nonnullIter = iter.NonNullTypeDecl; - Contract.Assert(nonnullIter.TypeArgs.Count == iter.TypeArgs.Count); - for (var i = 0; i < iter.TypeArgs.Count; i++) { - var tp = iter.TypeArgs[i]; - var correspondingNonnullIterTypeParameter = nonnullIter.TypeArgs[i]; - if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { - // here's our chance to infer the need for equality support - foreach (var p in iter.Ins) { - if (InferRequiredEqualitySupport(tp, p.Type)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - correspondingNonnullIterTypeParameter.Characteristics.EqualitySupport = - TypeParameter.EqualitySupportValue.InferredRequired; - done = true; - break; - } - } - foreach (var p in iter.Outs) { - if (done) { - break; - } - - if (InferRequiredEqualitySupport(tp, p.Type)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - correspondingNonnullIterTypeParameter.Characteristics.EqualitySupport = - TypeParameter.EqualitySupportValue.InferredRequired; - break; - } - } - } - } - } else if (d is ClassLikeDecl or DefaultClassDecl) { - var cl = (TopLevelDeclWithMembers)d; - foreach (var member in cl.Members) { - if (!member.IsGhost) { - if (member is Function) { - var f = (Function)member; - foreach (var tp in f.TypeArgs) { - if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { - // here's our chance to infer the need for equality support - if (InferRequiredEqualitySupport(tp, f.ResultType)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - } else { - foreach (var p in f.Formals) { - if (InferRequiredEqualitySupport(tp, p.Type)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - break; - } - } - } - } - } - } else if (member is Method) { - var m = (Method)member; - bool done = false; - foreach (var tp in m.TypeArgs) { - if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { - // here's our chance to infer the need for equality support - foreach (var p in m.Ins) { - if (InferRequiredEqualitySupport(tp, p.Type)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - done = true; - break; - } - } - foreach (var p in m.Outs) { - if (done) { - break; - } - - if (InferRequiredEqualitySupport(tp, p.Type)) { - tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; - break; - } - } - } - } - } - } - } - } - } - } - private void FillInPostConditionsAndBodiesOfPrefixLemmas(List declarations) { foreach (var com in ModuleDefinition.AllExtremeLemmas(declarations)) { var prefixLemma = com.PrefixLemma; @@ -2327,23 +2100,6 @@ void ExtremeLemmaChecks(Expression expr, ExtremeLemma context) { v.Visit(expr); } - void CheckTypeCharacteristics_Stmt(Statement stmt, bool isGhost) { - Contract.Requires(stmt != null); - var v = new CheckTypeCharacteristics_Visitor(reporter); - v.Visit(stmt, isGhost); - } - void CheckTypeCharacteristics_Expr(Expression expr, bool isGhost) { - Contract.Requires(expr != null); - var v = new CheckTypeCharacteristics_Visitor(reporter); - v.Visit(expr, isGhost); - } - public void CheckTypeCharacteristics_Type(IToken tok, Type type, bool isGhost) { - Contract.Requires(tok != null); - Contract.Requires(type != null); - var v = new CheckTypeCharacteristics_Visitor(reporter); - v.VisitType(tok, type, isGhost); - } - public void ComputeGhostInterest(Statement stmt, bool mustBeErasable, [CanBeNull] string proofContext, ICodeContext codeContext) { Contract.Requires(stmt != null); Contract.Requires(codeContext != null); @@ -2384,49 +2140,6 @@ protected override void VisitOneStmt(Statement stmt) { // ------------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------------ - bool InferRequiredEqualitySupport(TypeParameter tp, Type type) { - Contract.Requires(tp != null); - Contract.Requires(type != null); - - type = type.Normalize(); // we only do a .Normalize() here, because we want to keep stop at any type synonym or subset type - if (type is BasicType) { - } else if (type is SetType) { - var st = (SetType)type; - return st.Arg.AsTypeParameter == tp || InferRequiredEqualitySupport(tp, st.Arg); - } else if (type is MultiSetType) { - var ms = (MultiSetType)type; - return ms.Arg.AsTypeParameter == tp || InferRequiredEqualitySupport(tp, ms.Arg); - } else if (type is MapType) { - var mt = (MapType)type; - return mt.Domain.AsTypeParameter == tp || InferRequiredEqualitySupport(tp, mt.Domain) || InferRequiredEqualitySupport(tp, mt.Range); - } else if (type is SeqType) { - var sq = (SeqType)type; - return InferRequiredEqualitySupport(tp, sq.Arg); - } else if (type is UserDefinedType) { - var udt = (UserDefinedType)type; - List formalTypeArgs = udt.ResolvedClass.TypeArgs; - Contract.Assert(formalTypeArgs != null); - Contract.Assert(formalTypeArgs.Count == udt.TypeArgs.Count); - var i = 0; - foreach (var argType in udt.TypeArgs) { - var formalTypeArg = formalTypeArgs[i]; - if ((formalTypeArg.SupportsEquality && argType.AsTypeParameter == tp) || InferRequiredEqualitySupport(tp, argType)) { - return true; - } - i++; - } - if (udt.ResolvedClass is TypeSynonymDecl) { - var syn = (TypeSynonymDecl)udt.ResolvedClass; - if (syn.IsRevealedInScope(Type.GetScope())) { - return InferRequiredEqualitySupport(tp, syn.RhsWithArgument(udt.TypeArgs)); - } - } - } else { - Contract.Assert(false); throw new cce.UnreachableException(); // unexpected type - } - return false; - } - private TopLevelDeclWithMembers currentClass; public Scope/*!*/ allTypeParameters; public readonly Scope/*!*/ scope; diff --git a/Source/DafnyCore/Resolver/TypeCharacteristicChecker.cs b/Source/DafnyCore/Resolver/TypeCharacteristicChecker.cs new file mode 100644 index 0000000000..5663d6dbf5 --- /dev/null +++ b/Source/DafnyCore/Resolver/TypeCharacteristicChecker.cs @@ -0,0 +1,319 @@ +//----------------------------------------------------------------------------- +// +// Copyright by the contributors to the Dafny Project +// SPDX-License-Identifier: MIT +// +//----------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using JetBrains.Annotations; + + +namespace Microsoft.Dafny { + public class TypeCharacteristicChecker { + + /// + /// Infer required equality support from looking at signatures of declarations. + /// Then, check that all type characteristics are used and passed in properly. + /// + /// Note that this method can only be called after determining which expressions are ghosts. + /// + public static void InferAndCheck(List declarations, bool isAnExport, ErrorReporter reporter) { + InferEqualitySupport(declarations); + Check(declarations, isAnExport, reporter); + } + + /// + /// Inferred required equality support for datatypes and type synonyms, and for Function and Method signatures. + /// + private static void InferEqualitySupport(List declarations) { + // First, do datatypes and type synonyms until a fixpoint is reached. + bool inferredSomething; + do { + inferredSomething = false; + foreach (var d in declarations) { + if (Attributes.Contains(d.Attributes, "_provided")) { + // Don't infer required-equality-support for the type parameters, since there are + // scopes that see the name of the declaration but not its body. + } else if (d is DatatypeDecl dt) { + foreach (var tp in dt.TypeArgs) { + if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { + // here's our chance to infer the need for equality support + foreach (var ctor in dt.Ctors) { + foreach (var arg in ctor.Formals) { + if (InferRequiredEqualitySupport(tp, arg.Type)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + inferredSomething = true; + goto DONE_DT; // break out of the doubly-nested loop + } + } + } + DONE_DT:; + } + } + } else if (d is TypeSynonymDecl syn) { + foreach (var tp in syn.TypeArgs) { + if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { + // here's our chance to infer the need for equality support + if (InferRequiredEqualitySupport(tp, syn.Rhs)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + inferredSomething = true; + } + } + } + } + } + } while (inferredSomething); + + // Now do it for Function and Method signatures. + foreach (var d in declarations) { + if (d is IteratorDecl iter) { + var done = false; + var nonnullIter = iter.NonNullTypeDecl; + Contract.Assert(nonnullIter.TypeArgs.Count == iter.TypeArgs.Count); + for (var i = 0; i < iter.TypeArgs.Count; i++) { + var tp = iter.TypeArgs[i]; + var correspondingNonnullIterTypeParameter = nonnullIter.TypeArgs[i]; + if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { + // here's our chance to infer the need for equality support + foreach (var p in iter.Ins) { + if (InferRequiredEqualitySupport(tp, p.Type)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + correspondingNonnullIterTypeParameter.Characteristics.EqualitySupport = + TypeParameter.EqualitySupportValue.InferredRequired; + done = true; + break; + } + } + + foreach (var p in iter.Outs) { + if (done) { + break; + } + if (InferRequiredEqualitySupport(tp, p.Type)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + correspondingNonnullIterTypeParameter.Characteristics.EqualitySupport = + TypeParameter.EqualitySupportValue.InferredRequired; + break; + } + } + } + } + } else if (d is ClassLikeDecl or DefaultClassDecl) { + var cl = (TopLevelDeclWithMembers)d; + foreach (var member in cl.Members.Where(member => !member.IsGhost)) { + if (member is Function function) { + foreach (var tp in function.TypeArgs) { + if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { + // here's our chance to infer the need for equality support + if (InferRequiredEqualitySupport(tp, function.ResultType)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + } else { + foreach (var p in function.Formals) { + if (InferRequiredEqualitySupport(tp, p.Type)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + break; + } + } + } + } + } + } else if (member is Method method) { + bool done = false; + foreach (var tp in method.TypeArgs) { + if (tp.Characteristics.EqualitySupport == TypeParameter.EqualitySupportValue.Unspecified) { + // here's our chance to infer the need for equality support + foreach (var p in method.Ins) { + if (InferRequiredEqualitySupport(tp, p.Type)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + done = true; + break; + } + } + + foreach (var p in method.Outs) { + if (done) { + break; + } + if (InferRequiredEqualitySupport(tp, p.Type)) { + tp.Characteristics.EqualitySupport = TypeParameter.EqualitySupportValue.InferredRequired; + break; + } + } + } + } + } + } + } + } + } + + private static bool InferRequiredEqualitySupport(TypeParameter tp, Type type) { + Contract.Requires(tp != null); + Contract.Requires(type != null); + + type = type.Normalize(); // we only do a .Normalize() here, because we want to keep stop at any type synonym or subset type + if (type is BasicType) { + } else if (type is SetType setType) { + return setType.Arg.AsTypeParameter == tp || InferRequiredEqualitySupport(tp, setType.Arg); + } else if (type is MultiSetType multiSetType) { + return multiSetType.Arg.AsTypeParameter == tp || InferRequiredEqualitySupport(tp, multiSetType.Arg); + } else if (type is MapType mapType) { + return mapType.Domain.AsTypeParameter == tp || InferRequiredEqualitySupport(tp, mapType.Domain) || InferRequiredEqualitySupport(tp, mapType.Range); + } else if (type is SeqType seqType) { + return InferRequiredEqualitySupport(tp, seqType.Arg); + } else if (type is UserDefinedType udt) { + var formalTypeArgs = udt.ResolvedClass.TypeArgs; + Contract.Assert(formalTypeArgs != null); + Contract.Assert(formalTypeArgs.Count == udt.TypeArgs.Count); + var i = 0; + foreach (var argType in udt.TypeArgs) { + var formalTypeArg = formalTypeArgs[i]; + if ((formalTypeArg.SupportsEquality && argType.AsTypeParameter == tp) || InferRequiredEqualitySupport(tp, argType)) { + return true; + } + i++; + } + if (udt.ResolvedClass is TypeSynonymDecl syn) { + if (syn.IsRevealedInScope(Type.GetScope())) { + return InferRequiredEqualitySupport(tp, syn.RhsWithArgument(udt.TypeArgs)); + } + } + } else { + Contract.Assert(false); throw new cce.UnreachableException(); // unexpected type + } + return false; + } + + private static void Check(List declarations, bool isAnExport, ErrorReporter reporter) { + var visitor = new CheckTypeCharacteristics_Visitor(reporter); + + foreach (var d in declarations) { + CheckAttributes(d.Attributes, visitor); + + if (d is IteratorDecl iter) { + CheckFormals(iter.Ins, false, visitor); + CheckFormals(iter.Outs, false, visitor); + CheckSpecification(iter.Requires, iter.Modifies, iter.Ensures, iter.Decreases, visitor); + CheckSpecification(iter.YieldRequires, iter.Reads, iter.YieldEnsures, null, visitor); + if (iter.Body != null) { + visitor.Visit(iter.Body, false); + } + } else if (d is ClassLikeDecl cl) { + foreach (var parentTrait in cl.ParentTraits) { + visitor.VisitType(cl.tok, parentTrait, false); + } + } else if (d is DatatypeDecl dt) { + foreach (var ctor in dt.Ctors) { + CheckAttributes(ctor.Attributes, visitor); + CheckFormals(ctor.Formals, ctor.IsGhost, visitor); + } + } else if (d is TypeSynonymDecl syn) { + visitor.VisitType(syn.tok, syn.Rhs, false); + if (!isAnExport) { + if (syn.SupportsEquality && !syn.Rhs.SupportsEquality) { + reporter.Error(MessageSource.Resolver, syn.tok, "type '{0}' declared as supporting equality, but the RHS type ({1}) might not", + syn.Name, syn.Rhs); + } + if (syn.Characteristics.IsNonempty && !syn.Rhs.IsNonempty) { + reporter.Error(MessageSource.Resolver, syn.tok, "type '{0}' declared as being nonempty, but the RHS type ({1}) may be empty", + syn.Name, syn.Rhs); + } else if (syn.Characteristics.HasCompiledValue && !syn.Rhs.HasCompilableValue) { + reporter.Error(MessageSource.Resolver, syn.tok, + "type '{0}' declared as auto-initialization type, but the RHS type ({1}) does not support auto-initialization", syn.Name, + syn.Rhs); + } + if (syn.Characteristics.ContainsNoReferenceTypes && syn.Rhs.MayInvolveReferences) { + reporter.Error(MessageSource.Resolver, syn.tok, + "type '{0}' declared as containing no reference types, but the RHS type ({1}) may contain reference types", syn.Name, + syn.Rhs); + } + } + } + + if (d is RedirectingTypeDecl rtd) { + if (rtd.Constraint != null) { + // TODO: In some places, constraints are checked at run time. Those places need to be checked with isGhostContext:=false. Ugh! Better + // would be if the language design was such that the declaration said directly whether or not the constraint is intended to be ghost + // or compiled. + visitor.Visit(rtd.Constraint, true); + } + if (rtd.Witness != null) { + visitor.Visit(rtd.Witness, rtd.WitnessKind == SubsetTypeDecl.WKind.Ghost); + } + } + + if (d is TopLevelDeclWithMembers topLevelDeclWithMembers) { + foreach (var member in topLevelDeclWithMembers.Members) { + CheckAttributes(member.Attributes, visitor); + if (member is Field field) { + visitor.VisitType(field.tok, field.Type, field.IsGhost); + if (field is ConstantField { Rhs: { } } cf) { + visitor.Visit(cf.Rhs, cf.IsGhost); + } + } else if (member is Function function) { + CheckFormals(function.Formals, function.IsGhost, visitor); + visitor.VisitType(function.Result?.tok ?? function.tok, function.ResultType, function.IsGhost); + CheckSpecification(function.Req, function.Reads, function.Ens, function.Decreases, visitor); + if (function.Body != null) { + visitor.Visit(function.Body, function.IsGhost); + } + } else if (member is Method method) { + CheckFormals(method.Ins, method.IsGhost, visitor); + CheckFormals(method.Outs, method.IsGhost, visitor); + CheckSpecification(method.Req, method.Mod, method.Ens, method.Decreases, visitor); + if (method.Body != null) { + visitor.Visit(method.Body, method.IsGhost); + } + } + } + } + } + } + + private static void CheckAttributes(Attributes attributes, CheckTypeCharacteristics_Visitor visitor) { + for (var attr = attributes; attr != null; attr = attr.Prev) { + attr.Args.ForEach(e => visitor.Visit(e, true)); + } + } + + private static void CheckFormals(List formals, bool isGhostContext, CheckTypeCharacteristics_Visitor visitor) { + foreach (var p in formals) { + visitor.VisitType(p.tok, p.Type, isGhostContext || p.IsGhost); + if (p.DefaultValue != null) { + visitor.Visit(p.DefaultValue, isGhostContext || p.IsGhost); + } + } + } + + private static void CheckSpecification(List requires, Specification frame, + List ensures, [CanBeNull] Specification decreases, + CheckTypeCharacteristics_Visitor visitor) { + + foreach (var aexpr in requires) { + CheckAttributes(aexpr.Attributes, visitor); + visitor.Visit(aexpr.E, true); + } + + CheckAttributes(frame.Attributes, visitor); + foreach (var expr in frame.Expressions) { + visitor.Visit(expr, true); + } + + foreach (var aexpr in ensures) { + CheckAttributes(aexpr.Attributes, visitor); + visitor.Visit(aexpr.E, true); + } + + if (decreases != null) { + CheckAttributes(decreases.Attributes, visitor); + foreach (var expr in decreases.Expressions) { + visitor.Visit(expr, true); + } + } + } + + } +} diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo index 56eca2c2dbc166777a13cd0da606c4b65d4c84d0..1eff2b016db95aeb9b317b2f922c3580956a619a 100644 GIT binary patch delta 44 ucmdnPwTFv0z?+#xgn@y9gJGhp$wb}@%s^`6gGbCDdh$^g3lKet)dm0w$PCl~ delta 44 ucmdnPwTFv0z?+#xgn@y9gW-6R&P3h|%s^`6gGbCDdh$^g3lKet)dm0_VGaNQ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo index 93d2527fdff21b96a8e3717603901833f73b0348..92b8cb8b93dfa4e3be0c00e37d4cfae488799516 100644 GIT binary patch delta 45 ucmcb>b%BdFz?+#xgn@y9gJG(x$wb}@%s^`6gKx|rdh$&c3otFhY6Acu>kUZ& delta 45 ucmcb>b%BdFz?+#xgn@y9gW*h)&P3h|%s^`6gKx|rdh$&c3otFhY6Ac^`wn>k diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo index e6b61fa07aab1abec8a7d1d04fe8e1b2d6bb18b6..4ae511b9881cf35433d8a1d62c5d7dbe86c9e514 100644 GIT binary patch delta 45 ucmZ3JDlE diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo index 3f5667f54f140941aada848590966c83d1c778b2..d5304e865885089b78512f21e979bf42124a65d4 100644 GIT binary patch delta 45 ucmZ3)wTO#1z?+#xgn@y9gJFWJ$wb}@%s^`6gA>dkdh%)(3o!kR#RdQj;tfs! delta 45 ucmZ3)wTO#1z?+#xgn@y9gW*_`&P3h|%s^`6gA>dkdh%)(3o!kR#RdQ(rw)1m diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo index 0bd909f746c8e45af6f97972d6250af94145c0b8..377fb4e26e5cc78550f5d10dd4a50a2235c2aa9a 100644 GIT binary patch delta 45 ucmdnYwV8`Iz?+#xgn@y9gJHU>$wb}@%s^`6gPY7Cdh#9?3o!ki#RdQt=MBFA delta 45 ucmdnYwV8`Iz?+#xgn@y9gW+6~&P3h|%s^`6gPY7Cdh#9?3o!ki#RdQ@_YUs> diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo index d0a35f0b26c0c5100e216c638aa4a345c1d59131..9903fdd37d31085240ef17fa3ac562144b223bb5 100644 GIT binary patch literal 56908 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

X z5*^^|eXc%}f@ZAl-t@Cg#$XR?PrP1v^@P|bh zAG}iw8f+uGSv~y85ZGtEM9#hVlyHQJ|gbNyx@Gl@PCbOw2{~^;;Dv zgeYw0{Jr_M9uc+;%=yrvtwc=NHaflpY^>K6wvCN=i;eYCnQ=Zd0wXf@o&2hQVJ{#9 zz3zf8mgXSn^)ToS7j(gd7f?1L&^Nx5`|?uS02LgRAf4PnshfA#Hj3NRKt|h_dq`=x zTmZ4!dIU^^N={O$zBDH(SyoH;g@u%To-vObyY#$O)-00tVsn{ za}lq{YQbK^>wpVBWMEd>_07fXjkWbIXEv+!hXEm$X!N^ux)I;9Vl>!~H=V!HzY4diZedk#!i+ zWfjfoM(5G`gEd+6k*v8Mlb#JYQn)BQfUt$4abcZ5fJbkm8JEC-SVaWTHeu(Nz!rn_ z7e4{P33BFGRcF43t*&pp0PgyHaG7#0JF(fQb7EubiX|M{5S-gRv~lg4VskNa9H1sb z>}&?VbK9o$Y-K(vxs4N)Lffa5t_`@5$&V#_{T~`=AGs>pFK(&&S zsm338w$;Uhu0`ZwqrNmaN^&^@VcSo0oO!yN%x@tUwheKn-C)c@;xhAN=uork%ghEE zQyYQWfB2OP1hG)Sj2tp5<`BdSI%R#-l*XDlf2}8?{*mdU3MZzAgZJrKYM+Z9rn6CR zJo*EDZqX|M#>EQ(;C(?o^RM}_-F>nELl!}%`?G-2)}pX~ufIO@*Dt%e5XyC>iRSoJ z=$}78Y8o;YHmzgfn>rRlsrSBS6y9|HA`QK08xqa!ZCx)s znl-r|16!fF>9b!9B~YPHzjell(mRg)a^s!KcP2w&{x~Q5=watj+ju$0nVkv|doI3A z)8XU2odzhZ5xwtvJl7 zZ!}(MU$B`4h{VxUk9C6yge*L2C3`#b z;dFR07^GRIoYPU{)WB+C3E?Qk(m~Rc&W9q1ZaH#AmwC`L8c(O(?hcU{_9q9e-EaJ<|Ivz*RX_JTmx=Yo-(qu)~spFv_!lC ziSV8evVb~0A+hZOCbIeT+M7>A`#M^A*(TkJfKQ^U#6e;0QzqTeGfoFQIq$C zb><%zU0RJ3P)hiSk1-XX#)jrUuvt#|Ip=$|$sUjjXNud?P%|hd`9j`NbJUywNUtmU zGmpP@q^q{FOg4N!4<#r|OEFt1EL()|FaIGhde7 zDO+L!1Qup`dg}iHP)h*<6ay3h000O8jzu(B_J{zjr~m)}4gmlF4FCWD0000000000 zq=5hc003=aZfRy^b963rZ*6Q)O928D0~7!N00;n%MKoCcFR^^i+yDTyc?AFm00000 t000000001_fztp00B~||XL4a}P)h{{000000ssO4Z~y=R#@zq_000ixpCkYP literal 56961 zcmV(}K+wNXO9KQH000080J26bSoVkjt*8J101g2F01W^D0BvDzX=Y_}bS`vnZERJ} zL2AQ5429wSoFaHH6Q|ksA}PfTGg2cmmVzXQFa$#-kz4><= zH?k=FyZ?&zJ0~N`A{~<2>`3xE_9VI2@3Wme+q3HU_Wecf)Gl>yOG;)5)lsl)c&0S+)2uE*I6{rg*a$J~Y1{eqVigIUN>X?-j+U z9FKd&3;tjB^!c3q=XE()&gRvZva$NEs3wbMF@%42S@WWpm7kZ@teh9^;qJ1bVjx6tmZ?Ea>#D2)UTfdZSTclh0VZm{srJmoq`qP4V4##jtq77;)y} zaZAM0cwCE7p+zq96$V96)J@4R&M}f}&(?3s(M5yQg<*03Ok$+)8S;@i3LQ;8ANAFX zhc3X7n0~rwXOGraqqRe$0kqIi&wBG}Fqisn>%s~K0}=B(OpZ>(& zKS7LI!}D7Lbt>YEcYqs44lI#v{BMNrAp?#8Xz&FIJy_)vFFHhxb}w8J6Md?QBw*=`Mw1?fxmDB zsv%`IIsTac0e)8iTZY5;7&%*o^FXbX6*$``7Hy=&he*<>Ga+KbB44_32_?N`HLND@ z-z>-TMo*&Ex6o@Auj6Yt{pdA!620OZhV5R_hksi|qsM>j@?TDn|Db57mwd&=+5!N0 z(G!pM#IHX5(p(($Mgw55;)OjXgYlaEKm(uXcD#*+lNz>r@o8-=1BJi_LTF(rw1Q&DK(&q_qTqZ{ z7zW2>0qGFdo=)ZY0tlpUfJT;dd8@eZ)w1fA7i_n`K+~B1ORmKbpOdr9tLdbgKywzk-9`{5 zQ9G+C89NB$KSQ#yFuwIjj6i?0NX!D{%gEt-TuzW6>}hOCgzFgd3q*$Icxc! zd$Yx}DO-Sd99L@A-7wA-o0vLb=n3H6OyKK4#({AX@6RQGuwR`pAf8U1GqLoSu0SY& z3|>dS29ojKlqHXq%ax48iM8{jMsHxrN{;U)firMF&!(45ZK~4YldDhP7)BeuFvl<{ z-}g9E8ZxiD_90{{ow6Z!nCbB8a5%>VHbvKFVH0ObB3H@l@kA@cM9o@PO^alsF@K(p z$IC^}R~XF~fzPQ(Qd6WG2S<_Xz_EOdC9f>L1i0~bwww%li}GbP9FEF{OyGyj()VwX zwTkl2TZEiIL=)RlGlU2+jXI&JcH?6EvzGVH-=;*Fz)r%oUa-6rcmlN;0C2f2}YxSIFe@E z=#8qyntK!gMm7t_)2gDUH=37tp(URS{7%)*ba-t@W3B4E8WJ^zWLx5Cue-%KdNZB< zh=Ik-kN~(u#3)>SUo%hx02OG&hoTyCF@F+b{+19kssFf@UQ{rULLH@5Nm$CZ8bqhp zLO)w{$9U6EM7m<2Kxk_D$b<08jR|&9U5?86Uwe~k{-M$OBvz#ZqJ$u>RW}#~iNjve z`UIrpVDsP8YQFf1>5fxcB0yjrcZX8Lu>TEqvx(=_Je|*{gG#K&Iq5mWG{iV{2KvjS zH(S4gh5vNY_|%lBMh0r&kv69(gQSLGU3eVTzEy0`=wONX4ur{l^3!HqXB6aC z4(Nc7v3;l+!1I(S35d(FjHlDGR#h$dRm*jWb+U%O-K=Vi5kQ<*_2(nux?-zNOGi2S zEX_bh+yh)$Hc+kvb=b9uz}+HB60u`!q6Bgq43*9xC&!A&KhPHhTuVntEskK82oLc1 zb)bYf`GX7>bzmlqTLWzt6d00^&!>=gl84Gr*mmHo1otAU8$S^WfIYjTM7 z@W9_K%vwaenoh3td4&^dG3KD-uAT?6eZ~L^)XuOKHx1&;G=?`sTxdP9)t;ZbmG^*W zV!wrLiZl3WmoGTGI`Vb4<&g<>81xE_yr(k1VbGbbrs2XCW(z;RfuDMaCxKnStbG!^ zK?LW?zOgnih}sMnucpTa2h|+TB{_CG@!Xa0Vp+p-!8?Hj>KP=;)bQk*!B+J=2qCT1 zgr`xJJqaVJw@2dF_yoZ_&V%v=$&HZblOgL;P2Mk=Ecnsx|GS(r)t)RuMgHmHexS!x z$+I7Q)~E-y$?~Bkm!5KsP_=CPWh(#5LHF4|eV&Bn>;5HQ_p_gSMgIh6WzpzMIr>sp zi7%~D$(&%AH+2i)k#_aOWZlQJm#7EN;2U5b;8z@h>ssSDI_Qn)XkJW-n)tW_rGf5V ztAqcb&h*vy9}O%iK_kBKwVv`P5WV%qniwbrr^Xf}_0o;R6o6k_6DACsJy}BQroi6w zlJK;6ASi$kqc4*IdoFch&x}J4H5#>k@&@ax6sX_sT&$G3fE4U-;hw)fN$G?>& z9KDWo)+tW9LSUnmiD2%C+(%?Z{Lx!`5`pTV^7M1k-%Ke zU-2Ih-eqjr;Qc6XRe=D7b=e8JdxS%=j{`Hfkiw$US7J=qRm+cLIXDki&%mfBzqG0J z5;4X~r3e@`cD1t%0o)yA(Stuu$}txeiGvvM1{X~`I5>uriw$vRBxDZFqL-*R;02i9 z^8zA8&a7tWtAaF{*04=#=GjnB@880?zL_}J=h;eDRYFfzB`h@xGR)OOEX@#fk%A&W z9o^1C;`WHKLtMijtpPKwfC+Boq5yrH0`86fyzM?0STqH0)&b2BwqA4`z}u~oFzVIh z1Evm_*?RnAZ!%bW(Q&OcS>IDYNGPxLky5+pTp@x^If;GN3%=e0WrO}ptN+rDgKa%! zHh5ugh^jk?G8vE`KX`iK&`PYm`dSsEe90Yfr~-CJ;pB5Mk}##z$fYaq|zkU zU{qSB-jT+kTnYqqD1=u#RFC8L*{~pInCT#E9p+^8y8t}CXf(W@SV8rcNh|e{I0vBjZC-3zI z8eXn_oHz&Ro~c=L9LI$^LX$ooNu7?wo3l{g(-@naA002iam5zgy0fyfXlw3dRwsb# zQruVd4dgisbK%*QtVIqUs*G?fKP_vs(m!qqTysuciUM=PRPqRBUUt?Q{yGZY(Li^g zm;w?y1v%SsJZ&qxui-+6@*KPEKEx8%79%Oact3gWF1|~B@>snvttaxs* zSyZ}mw&Lt-R7~G`ya1tZluQq<-hS&1;W{skMT$}RnOiRb0cc5L^n}tEfudrfjsL*a zvcMSE6eussL_qz_zoQMwyn)kYv5f+S_2&}L%6Vsdw#aU!1 z4qf0Uk@{$+YO*|-Jcztke1yv&R`3^;Pf+_n)-r@%UVM~mU8Z-5 z);o8>sBz-XEPCUE(9viDup{+QjpoOAEQAig<~j>9kGRDq4P0{sw9>Z#6t^E0jY zQfbEMUW^C5*4~Wl9owN%1GMZd6!qBb+H9S%w?}G3hPs742mw@8X+?*rzZVlJxS$9| znjx5cQWsIT<0hL|TJy|aJau!boh42n#?9oUPV+OEG^6LcGw5(jDmGRC$5ef}gv~m~ zCv7n|lPH+QYLD3RQ3-Ql$Lw(}?^Fk|fs;HZ@o}buO)zuj2<+_B!K7Q`tOJ5EH8G66 zdy4J8{9X%HXDzPAFt>fm>tx&f0|k?!#izQlxG>hcKGy*RQgTzy3v1$w_Hf$2+*fPUZwtOI=uw^BEa}9BAh$lq=7Ps)U6R1pn!KfU~C^E zFZ`9F8QXg3-*!^CHw14k!q!G2^m72YX4$VH!q&fn2y>jmMrU8Y@xFoK%6F)J zh4&2%$^+E-+(mpScP-_sN}_hxW;Ml_vC9w;A24LB83NDDrelD&9w@C14mkZByI^bH z8Y`ZS37$FFxGVx%$5u2*BT7Rjk;@o`;Jq7F{-OC_6RZQWtuC_}7pF*^VS}$D5)b%h z;;?R>3*VsCF6isB{M*dzabqJ!9TP%@8wR0Qbod1&1jm*C~|x%y&6 z>?*P+Vqe?H6ul!g8t!*6>f=q==wcqJy#2Mi?4agzv z#*MGPaVCwd{zy*~D#^Ci85+F-2e(bunllVOb*p4-VXCp+X(J!m_+Wv#BnP}BGCP;K zj+>@w{JMJoVX=kGZe3o0&|L{_dx7C-T0*-COL0R9N}(jhh?AdNSzXJ=v$cT~4L;im zuobns9Axu_h#*D;nI6{>rk$70mgBbOcO zwu<3%coQhL(l;R4f^HU{<-apZ@aVFk(5XC>{$?`y495ueikYP?pNlj6@iz5%=5ImP zC|mrjQ>xrrmTF*Au9)gLb31fzG4Da=49|H3 zg4J~ql3zXhERLpn2LaM{_!dlAZXbKVjJcEQ51%b-;ZM(o1t9*2ZST4jEzjg;Y3um9LYHBMR~DtY%Fkj zAOb)&MXghDamZP$b#b(Sy2Mc7N2mrKk+MZpt&u0UO`}w9l8=aj^~>NbaiybX-C?W6 zkG{{#g!fyC81KzFaF+^hLde^$ox)PiAayf2M*#;VoxMQPJ^rhllnlQ+vE~}|xbU(S zD00tv)BrLVM>pYEpk_(V{#MS#<5(smZ_N$WMfxzLW@&_@)gW=Kwi20e5{}ex6%9gJzYOBOxdih^ z^5a5FLbOQVf0)h}XoDPTMRmW-5P~Y`*+8&ibcwF?4srzZt2_$yBaagjBa2S2Q6Z0i z!#`+KIWV7H1t%+Lu|_RY1lPSU8P~ zrFHUd9waU(tJNLQ_dpoRBxau!cJlFdrx1Pk4Q~MdP@u)J(D>;Sfr8;t5dJm9-$Jp0 zhosC}QDSKLf~6qr?#57Y&sn}%_Jg-qdujxq&m&oDjfsV!ABR448{scmj%;Alcj@WZ zS+*VauC}o|*Zh0}m)SvuB}@)#BKHm4afU(A2>Z|gQD2dX`n3btaj{9V-0(8$n#fZZ zc^s&ZXMj8Yj9`2_Lne7}<|X=coW0>igu*@lQQw;cdJHxDDPRnbxzY60O3f|ut8vJ@ zmfIF1yXFK>wXusf`r{LJmyO&u2hs2b$QyzB@`>()Z{$o5)+^*CsY(Ff@~b@dT$$wh z)H<{}qr?Wrn_H>;O7O6CI{DvgrbN!MY`QoGgW1@}4Q*qxE--n(Z>y6lG;{`8c_ZI| z0(XRZpdGvgA-&L8NwdtP%;9~95{Vz?Hu%F~1-TXT3ZsB<~1e8D-T-e-STJOk0ty$9Wlk7w|+ljfu2 zzmrwf_*#3mq2ceIayINzy8o@RGb_e1IP43GEegi4+h^!O^elD4>#7k#e1(HmH@lHSt$6CC7Rsmxv&~v zPMLZzU7nP~0`6{Hl(R{1G)Hgw<5w?=GwVIG>rpi+dov#lKMhTQc?lnOXJGLA7#MCt zJ{a@Xe<(L9O*cm5csg8;N~R3MYR*4xq(^)@s}>)|<)Rwg6mJ&8hvxS~Oeiq*f~h#K z(qLewm%Y!+@}>||tXr)L|FvTQb1_Ni7Nj9mraG4(Sxux|TYTbB1M@^;Qy^n1%HEub;3TzsWO~kZ*s~&ovK?RCyDz++`~hYT@4QX zR<(x{9xvnqYdOGL92C`_Ein&PIn`eB@Q2j4&Za%uPV9P&xHk9&qXzq}Y^{EdhGqB4mG+n!}oLAqc;GMUuvwi1Rj0V6Ws~Xp&?#pb^(^C8_UxM16^ezqHEMLJZPKwqZ-bo2D?KJrv~3cPN;?ef{v+% zB?np;)aYAbWVon+3bb|hpk zMq<9Op5OK2El>0@m+FwY6%Q%)IcBfq-nLeS9rq<(<+VB|lt5%KM7~qPq&BFs)>CQH zLT*m;F*LY+M#hbPFNCaHPm2C@ItpT^9~tz-jR18I>t1xQ zS3M#Q_r^30&DD(+ZMm-EX{-{QpgS2-c$=msIEN|u5L-2v6Ll)sr=&k{Xep)w@E^6@ zN-b$I!w~$B|EO$OWr>Wwmk{?_1d{c{+eoTDcVl1~NX=jEo84+^-ilb;!UJnA= zU|Z!+7wraFPmZn-FhQdH&Y((_kYB@t#AYr?{prF^0HjHvQkoC--p*NeJIf3OnnQGv zYJ!Bm-xWx$yfP{jSp>EGLv zVz^Airj*=}YB@Vn(7;Mlcsynp@$Glxx$s;n6EHf7Z|z*Q^C0ihki}xn-X7RcC9&TN zZ2-QczL)ZwYy(;&^8*E|^giH9zovkAJAw8dyf@`+807r>m=7Yv3QP10a_y;!%uw?x zvic-f!$u|z_yd;JwM8RyciE|45`e{G-c$>X|M2A&%stnDt`b@RJulB*2ltkRdq!5i zCh9GNdPWXEka0DFvA3jnT~I(F{S*jNVWS1|ou$gUCoTzs49`cN;`vw@Rq+e9s3;b< zQ-1wp!>?q6F)Do_mqg{{UV4Pen>Q-CybGs!hC}?BMLYeFOol`@^U*pcy3ZXvngND_ zGiz6uBDH3QY?&Q@YiYtmNA~yu@3N^u5y)a1kfJaOl3>#K7OwywFl zw72b5PjAMzd-86r4zc5JOX$tAznz3KDkL_OP|K6hSW2knN@y=Ap|OxqYhwwGb0jpT zBs5M+Xq=XisLs3v8~R2`=o|1y|FNIju%DN3>-H_!&uvTRKei)lu*%W&*Dd7Z*C8oM zd0|3i*CYzX%>RsV)Y3!+POY*b+Dz(--q*d!`;x5la`;lK(l1qf_l;A0=V)_&;oUb* z;oT;HewT8 zV@D5U9V2^eL8L_^=1hsh40%wU7W!;WN(`?6IZTTLIeWK7&YmKtl~2xIVQ}!tv24+; zO4fMHblI(A1#W^_Z%?PIDJRM)wDe!?i~`|rL`PiwsUK=x-pvCPuQXNwH84q>tN?JH zqC$=sXKuUF*r6g&1{^8@mLy)K%6?Tll{<-1cr)p9n_zkbKYnl5L9@|O|6(7Nch;s0)^&b1Jyi;_avr*3sf-R)CL z56Bqkw@?Waw(!wbpIJyS6GMK>9qh`Kg6AyQ(3wK+Vw9g>X^+kaS+habFvwaAvd$P} zO$@SzBX4SuwH}0Tam+ZmGm+_amKwqNksm?j6XaTOfdjA>Blgsi4^7Ou3MDJEpq4nH z+(?#d^%R}1Y_F}*EN-c((0jEMdP6tf1%XH0_`k1C^C#5mIT#}eCEQagy|;}@V`w7o zQW&*rsPyd??4dJS|4&p#g^KIFf<3pO^8fAXr)0sNtC(BvW&cMlHz?TqkIHUeutyzy zCsP%*kJN8d>{q*-j~vY{=i~PZUhogA%g?K4-j>}ioU4;vUqD0yb^(t)0#W7%kpjNR zQ{2Na3=G)jnm<`DKJXh7NelAs7zQGoucjvnGdXtaGxuJlpW;}~mE)_xSSDF7d6#+R zHTlt(%}ceGPURp~s_&w(lf4>2tOLv;UX2WE;8%+| zh@e5AID;zqy5_>YA3-*NzpZ1$SYYUTBaP^M$3Iu*Jc)bTPNEvCQ?D9JgFB_bwG_D8 zlhAFHXLZu$S<8`Fgq8E03v1jDAOPCp^8@m}m%z44{GgKu!M_F3XhT)VZ@g6E{Op6! zwt?#UW;qy?^Z9gElR{WzKq`1`wztIZLVtB(Pu3yV0NQeZwmhIM;vzL8rr7#7yn7Ww z+}U@cQ6c2v?J2C`kQ$YMr(3o0c?RHwTws<-N+P@Y>XmDx?$YxEX73!e?xMQhosIB6~5sMx^$h-PI^OGUBYoJ z45+^#X~_;hh0PkkO({2ev@5Z!FEBW_Hq8p%N>YXb<0WPM3y6u6dG<~0=*~-Z-#pA2q0|Cg z9DBu6J~7B*+JUe7%E|}zh2J&4hmbNY{3V6x)z8j%9nJNr53CTB9K(&#YmBpJjk71_ zrSMqZmzBs%!B)gawAY~zYb*J?olDD;v;Yd6lovfk$zGxUW<)WN4MA8_V6w@bb9$s7K8J;63EgT2 zrivM6W-56FDrzqMKYjtdOdaBC&f%TElOUWeT-E@y!)nU^&$>RG|DT1}33`#@B5sQT zYUFt@tJMtw9lzI#7X~fo*RUR&Vm^ONTPmiNYUAyO=QC?_Wen3A(LHOB405+YisZEg zkoF#TNjrr^lnq)mzYY3QO#=gRCDjjX{XNMtB;(`FRr6s}BXrXqbVCMoO}~U7sd(on zHXY3V)?2%m+oy#WoUgW2r%YR-UB^B3UpLSpM~z%pZ_O%vy>Mr92|Xg2^-Sa7iny?S0_~_vnCc&QUDTPM3n}={W7hxXG&(AyWw1%fCu-NBK z4FuXxFWJIy2%F~FQ4GWDy#3C|USm(gD9z!C^XUl?de2Sb1&fe|BF^*yaiKrlY@)FIH);L154#Oo}K zn7^2ETUaMf-8L=)QtWDP1R+6;o%rMthVE(<%B2Nn)%1Fe@%QIhc~Pw#V`~-_Rq&!N zvJjddHpugb536@vN$jW9!-wzO2&u~Tlhj0Q+cfOCcicNjUBo)?>{-Mza)9y#0f|{_ zEh=(1HPGy)m$!c@eh8Tn5*A82*^6?K{c<==k|2MV0}&4Qa}l+!#8;p2G37 z!M%}z{9c$sXc9y_6@hy+7^Ad?QScJXN3g@8HXGvQ{8yY%bj*L96RBOV*}q;zuXezv z;?MOwF?FK{>st$w!qap(e4?Wx@i6caz2pR?WaPyI;YA|~7tTW8CeQm)UZaCXi3}6` z{$O}!OwEgaG`J?C!F3`U6qfL+{G3qHtQkuwt=)!l>i5rVB*o*H9=kokfA|5H`S(Y8H4S zHMERMnoPv2+i%$F@je%3UG*0{5`{9{A6K%NdIJA)&)gP^H9^R)AF5Gl-IG>LShuP- zS@>6|nO7@p5AY{6@r>cVZw!6@VLw+O@6nu|08M0i7!f-T=%xx^H%TYOpd|!P3p}w5_g^aUcA$HS$oK43JZbM8VyS!Y~ z(|4_z6K^;DT+9vbcDnvth_#u{o_?>wH}&G2Uo#@`f5(}s&?&w}rr{lv60INwK0#5c z`Fw$k%j{# z@k?`}X6(g{28%b@SUd?L!Nz|zo$!r{n3<+G;f$_IRfUBjwX|~9k{mhvW+_WYS@@+SFm3G& zA=N76zk}9bY^u=v(4P(BDk^aGtGH5on8t!slN!j01u-G~{1H4YX%M3&U#ZL#)uDkQm2Op4O`&b>ct5IgqN^@U{ls~xkNjVE0H z=v2$wJuQY%MNkQE2mMm|lG276yo{+(+g2fzGqRM_tPxgteV~k>?Wvp57x@$%BwgL{ z#>-6FEbvM>n8^@cTQzrZbJv{$0%X<_(Py%1$oDjQdO(FFPOy@N-hG_sr?&)oIw=Ph z&o-wboE$iATFQbNO<-9qQ3@+FIDiu#@thyCA!|PL)+SyW5Z|lTxMGffFkLQoxoYbX zMW(K}zLH%z2=&nx-kSg0apDD}Q=tO>#`!ybg2@dRBqBQulWKwy!Mlh}ytTr-4fL8X zZ>=>D%3Ymw@`Nc~ zX+}jd&Yw|Ru8N1}Pk*u{W>k*E?>?iZw2YV_Q_2-o7lC$Kt(>XVc9d2>4ixp~6Y#(G zgc}#fh7)cpIN|PXG2v#5g<&0>hWWq`ihNigW6|mA_9o|+Gym=VktXLLa`}^U4bK&r zoV^P_UrvXaH<7X-O5)N`rtHO8@#pDiRKm1Bf5@Kr&0b93_uw!-f3;X&mSS_2b*;>? zd-PpOd3Xb=VrNR_0dYa+Q;06Hx)C38v3yu=FE}x3F z$)oa&?LSZF&*$tv$=!V@mzBr@p2fE?iZ?A+>ar1$-?%{=$`qjy8ue2{lQo@M=b9<{Onpq8v#MHquzU6n9R;QEd=B@kltW4b;jf*V_5#z|PE6rW z&+I2V?v@{REv|AYXS1WcjpBx!hza9VwJ>NvEB>^-R~jA}yv7V9xsR+~YiSU#Jz-(R z5M(JWsjCEh@q{cN9SecXgnM+&I0e30s2T;TB+OYYSV4ua1Qhp4Jm?rW zfE*nfrNSHo44Cu)!xYDjA|V%nw0Av&IoKh!r{Rv!#DaG^;m@XIcSLR_O_W`%lVpdj zrX*K*V5SNk|Js{W^ABmvLs-<21~LX;5cU8K`*k$VB;(0Y@G0WV&F>5cs?ZJ}=s@g} zZp)Ps{71nizLTUPgvdja*J)-}#AeqK?qI z$+grZIOJF4}{Yu!528Z0ydWXIxLA}_07f$aL|mOt<85o z>Z@T~y|983bZ3AIa>O6NXM(ctlpnk0D=Izhb4F z<|HK>TM%pVNf+8gO95!sras>6SyFDZByQN~hD`;xbOoyOXehA9@FIE3#(9JvNY;Q|+ zr&8swY=j7c(n7Rhk>Wg!i4zMbN1(s)EykV$^v91+)%1z!Ta%<_zAeZ4Vnl#wAx2~v z0tQ}^N=!D(Z`(t*^7S=FT^ZJJfmhs4V?Ybz+6MeG>g{8 z@e{4qiXPQEq&J2;X^ly-&7EJHE?vei$QQ71&^*-TH!JtS?GrWHRMsk49Un(U!2N&di7! zI5rprCCRES1Ddr^ZWYidlo~-!iqGf-SeVFyqmV}paD6Sv-__dbDCHKI_=@UkSx%g! z7Ce8RPQH}0c_}}<+bp7afiaN-7^_s+n8*X1oe|$;v^8feHHV97t@yP>3z{crJyQe7 z6AQ>`Eg+{fCL02I5+o->FkwreC59{kB-0dfk)Ih>30zxf61y`Z%MlplIta`2zGtDV zhOdInB4hJME4uENxmfd7jnP%xXFB6m0@~)nZbFQd{b*#8r2FcJZi{_ zjlaD;wH$kjW4XCKh2W-S1Wc|ko7?b#HE76INYt?9HEan^ z??ZkwCx7Q!f9I}mqXAmZ05MH+!Zdn9K8ZBaUdC0V73mVu>(Xo3h|&4x^Kk>|T4c#?xLMoheX>uB4cpE1))%Q^%K+ zk9$Z?otT`~S#m;5&se%=2`FnfLMO~}CDg_eI*W_wc0@y%5P|hZHe|t}7TftkLAO#R z#genj+1@}fXHqilq-4B1v^JNGzwt<*9+6IL%dj1nkHzz(g#I$=&DO7={d5wYVp=)~ zYBk_bJ@dD6rO{d%5K9eW2_S;I${4{7#M1IMq6EqysVtgm6tyPc5j(mz`;+4Ob8j*z zNAp)wz_hdTqSjVGN(65MQgFw;opM4KuT9PYv?AQ~xs_xv{@l~H<`Yo5@{AQ(F|5@?;{wto}z83qAjw0O6lzj_9nyCgd+hY2ssvO#8yhOZy7jfpD zE&t-xh@tYH^tzmG;T=w}8`$OH_B-P4)L=k)LXhSy)?C`Wm-z6bSko79GVJ+eQO+hk zHsPs5jN~av-E7nIk8pT0bm;{g?UXuDs{1b3FCfYsKQFbQtBay6+^etT5omL#MZb_| zTp3hVRpU3h?pQK* z8C6@xorH|d0KSYnQ5m;6gp#^zp!CWTc+)mBFZ#9>L`|6GV9WQtZz2gS&{6IXs$of# z6zc$6kVL6t*la2?0AC|6Mfg-u)J7=nxI)2@I|_2lXQUGo?1|m>D1FbPwB-lt`J_#iZ->GjGx44z48YDam1NdWp|GS+%>V3uKQJ&6 zAi{kQE{&kC-4IQBY-UKpzeXGm^VpvujP!Vu=v4T0IGh_HcjR3)WjA0f93a1@qZHbt zAMK)Gt?OPqR2t{NomHo>Zl-bWkO_c1(G5&fI(o2g6v>1U2q!Qs6~qYY?SLcx6`xup zrLM)nVR1(lpXbsTT=w{5G$Ml}q#<-lb#>5+P-1ho9$Oscbi@HHJ;rsd4mU1biT4AHX~szWOK$6z>cdzLv?l7G z8aYp*sTHvnwH@?C1V?v|S&Bp$#Z`a$lhzk&xSGlkh$aK-u?6DSKHdROoK1o6jgb}R znXS|!zQfg%oK~DeGWpeUmh>;7VhViV}Ntl$h$K$qt4d7GvtfhJZKIh5mNIsRn~nW}z4`?+$DT0tduxd|`Q7 zjpa?BMw>8|c|z2W_Y8!b*pv5Zl3i{**vd2a=njEqk}(Nnu;BqpHiu&9V1;rz)eVbd zx|wnq>1ko$Iz`~3*<$k@i3C8qBFDRGrO>f;(gme5Xn`%74Y3M_+ZnFXb?m;n#QnOq zW81NN`5KH?j}6~fIW>t=iK7!Qn$BQpASoI7R-A>3QCxVWEKRxt4t!Hfs$@2gbRSz<6#5p5Fq##e z;q`}U$Y(3n>MV{|C$QJy0hA9+7?c2vlB5hmGqO<8jX+uic!&Q5YJTEAZP-vkW65UT zT2!jXg$2gG=iJ#c6sebHaUmN^2tl<{J$Bt}O@B=(scaojyX7C+sgZ`lc|o}w0iHvp zqueZ7zMt40mun9dB50$LA~ImUBhAZ%)%Ls_B(P7nzK0{k9Iv%lp?buUmInkz_uBmhZG`J1fu2>Dx{=cV00stEe*mS&$%V zHt1bMn<#rHOwG*vt4Ny>dRI!OH)#Uw0G)H$a5pNJLdDTIJa;B%MWZh@XUDpVMyyYw zrh%zBBUFvtuO{dG4K?mJ(=_ctLj2IGc6Rr=mPCe7wzH77ZK!3-(deh;g7r5c*h>Cu zr#f;<4XON3n?7asvrNhNEv98jJ#1*fOxKltX6s5Fo(f3Xu@qXn9DDJ2f8&=q zY@j`xZbEH~J6$(gn+VtFvF!@Ai{CW_iMlVo7G=&3Z@+sDQ)39l61S$FFj)mC{w0x_T% z*d$ers~i>Vi<;%@=^UmG8{JUZfe;IaM&#zg)ejuv4 z|MVw3GkxOoot#8Iu~m05=kuOkA6dA3+I4Wz5i*;a%hlT{w5s^xo&971vdtSszR#Kj z`4FI1V5s}}f-ojj0hphr(@nZolRdl1A!O(({-2``ZU_+vvkoH@)2Vx;I~`h`D%G6D zKF1xeFVX7g5Vb;Dg&3&lH;fE(&*J;8&r0;#Hs!dEX}R*(Z>Io8%aV!J#w?=qNx_B@ zRYyR%T*P5 z5kv)y_I3@@G47sN8sm6Dj#IUz_X+D|03mmpa#)x`*OjK4%C-b!Pj_1av!}srfNj<{ zIAhAbk%M<|^)V&6RYa9mV)&I&C43@^wF`V$YnyS*ik>i$6}_bQ+<%x61E~78W&udU zq4^?_5Qry zZZbIRf8BQ>su(?Qr<^oSl_o?{24vdv`t`~os@u#cv zu72n&brgFII%agmQ}Y^0V^<&Tw0y8>VY^ua!_DaFH=^6zm8{{xT=T%-W;&V?<^s35 zi<^T(2A6Z|+oi?tp1G?_?qLfO*aJAm- zWpXXxfUp4F-$5#53!CBYD#G{WU^*b4k) z5JSFFvFK1&8sivXzd$OKdLV(;|Fg{5e$2! z8N{M`$zki}{quK%-zI@!vHASr!-IFb#U6#?`N6}7??BOcx#PH8e3%Z=+{SQQjutP< z$@|3z&SXCNw+zn*#r}!Yh`*kczw+4W9Cv%ib9H>16A7%6u*{Q>{0Z(x$Q>gtf&KcS z8nML=s)wj13|!TlEZ9?vqxe-@uZ#qD-Hwbr-ti;*opTE&p$H$a#$4a zE6IBkR0CrmwRs|+0AoI~C;RFNXgrrJe`5=}Djq(BlZZ^-s=31B9d8c(*fj0FIyR>p!{lN zRITK|P(%eGC{jESgs4>$d^)sm6#rcE!1KNc)U)YwGMp!Uu%-EW_9GD61#g1PI;Y1s z!aQ=Ji&81&xLj`^uFppny@k0Iun#pdnwuOLil`t2 zMT!T4&;@FGn@6WN50vzdkwCd0ntlkh zZpx``ZcNT5rP^|PP!rSJhKLW*6 z!860IxCF8|niEV!IZnpQNkWu3(48q{faEtbL#5*s<1@?v*$ddj*dZgMPbmmDzxik> zwap$b81v-OOIU*I%Lz0@8)AUI@81J?qHq%AHllQY3`!eCG;W(;IJVC+uN;RLjpfPt zJV^*4im(g0C8ewxgD1ugE#SzZg|%-nT0KV-87^r5dGr#t;ARR4G(;O>fO)|D+-2R5 zv+0;`$Icv;?otdY!OEC z#M)nH|f1GrVt6Bz&YV8bywe z{Wbz2_(f?&ApK7CwzKdAEZHDX+Hm5t!5+W>B2*Jo<+P?0W0(H2=N43jN>_sW1j7DR zwQtD$hW5{}GLBou!jHA`uOC?zzUN?2?8e<%C zip=bnkmC_t;sFE6JJC`u<*#LHMOi$Ykd4FYBPI?_7oB*cBtquhg0Y~afiMhm6+o@E z6ppW^i=TaD6KgGWl>u9Nsyv{*0CTjFSjieTv3K{M&pR9u(8F`CV=a;2=f~C9%P#pc zxJJXU5ifnDOy}jrMYZA(@CZaU(A8S|2;P7@`$53j59}`1J2h(Oo!!Vh=e*uI+rgKc zL@F+CY-`cXb6$loLIhsOIaIZnpNsuR7QlrT4?>7E9f`H4=|tvtyvuF)O1Mg z_>a2$QCmf^=R?-5SqxdrU>&p2Ta8h@RnwV!SwgsoW=@oVm+ofvc^?q&GlUTt)Jc=_ zJn^~{f8EtQ!r7-%u-Sgp@gD)3nKo&z21;E?wq~#~k2wLoDWO>j%{Z#EF;)gL)l;i} zwBAvNTPYW}H5FM=P3EGWuJVW1w5ZKVUHw&yNsh{P>P9R-9rUaP=$#r4ajMPnzPZT8 zG%$90F?N12s#GyWy}`s;&YfKQQ;ZLIgiZCe5mtP?&WmU?xz3}3)m3b5Bi3ByX}B{> zdFmd0--Y+8cnL<_fgve37nx4yc&^>?-tL4~x)I*y#j(D=-_QeW=NvMZ1YvCO3=xDy z9N0uICD@{qY|(Wqp*TW20;8QMN|9+dbFrFnLctMbG{GN=2pt%1%o#eSM8=DiXLmJY z#E7j_QCDEJ#Bl|}thQ6);8HlkwQcp@833EX))qe8$%Eibda=+8z4gK`^v;{vuu73( zmurbrb!%@BA#-c^tiF0*%;vF)i#uB|7@?5vKMECf|mV%ulXC>ZMEAiTkbDDz0;=CJh#WK?JZZ&lGWVTzJ zx822fVj140Ld2|PxP6)7?JUFFx3&h)oD-M|gqPJ_9kP;K%HRs>>9V`trBbengqIsG z0Tsa_FF0}y$6Y|__jUbDX6P6m|2#M;Y_bX#eB@evhs!S-b>G0EXhdAX2K$4-*d%Kz zcVM`|LU2_@P4snERqb0?MYXqCLTNP)E}9}t*;ezN0faN&+MfT-mP@y`3~@w#2WyQQ zONrDyto2F>DKosNCcP0z@y(()Tc|4(^m$0?rq@QWPJmx_8+?2I@S!uBD0^#IHE~W8 zsExb6www~xW;a}%Ej0D7y-`)K(sio}*J%A_bs@JX-o+0ZCjQLLqR249w%RnVe)2kK(%Z zwZLdmt<%8IxkjfIJjV%^@b7qm4bAw+uV2TUm)|i3~__tw-r=-Z=A`kDALHmL% zq^T2p**4vHR@)N<}5F;YNZ} zHGMT@=;xd`@~1KGJo^vdEC+*fKL6j^U4lZoZBgtYJ2dRsZ`Tb-e(Y5vHgMyAz5P%! zBv@Mps;K70xHr0(&c@~Nf01W)p8Zwz44;C#PZML9wEIv3F=W|mk-z#Up5A|$&KD@8 z7O>?-<3vD>k2gq~2mVJ4{O>Iwim7Rb8nAZVtqp3sc$7%CTHxI@ns{vO$qM=Oiq(v$LxaFWgyc527pldeLb!;dKB3|t( z&P8EB0SdKXPvUk^YxocxkSTiPh}Xf1Y*_;ryT8<@mI+buU=8_hxBfVGSEIHxO(Y>V z+f0U;+MEti(oT_Ty`}DVE#0Sws;Bz_7#rw*_m*_O>+60uTlc$L>V6mNemA1~-OY8s zyS?tmCRxz^x|1xQLr%S!QcslOh|T^u%+D-bn7{0OD*yIjIx0`!K2gi=w@;cyMdbsn zTiO+lJmp`B+p;Qkjrcv33dG4V$hHamei&aa*0I_Qxhr6e)kp=E!C2OC(8>Eb=d_)R zJWPTvd`E{J(dGueIut<{;VGm}Fe-hyJK`fi>-A8KiB$-O8!6_$8s@+VfcDIyj-YS(iQy!5j;kNlIpz4iy z^dUuzK9+ZD6Mb}^zlG?YoW7l?noGuhBE&?MW?-cWZitfG&RzsTvtRQ156JyE4=D~> zU)7>VN>{T**uau2MfCAz+3kl*i)iCIPw$qk}8L=xt~z zZ$wOcc_x^O_j9~HaY`YOdGoHML@mvd}JiXuD0aVFtl+!IP5TKnCp00#~P zpap|zpSq)Y`vUZE-X(L|tGloXXvQBU`uZ(3BOUr;&Dbc+%hHUxNw@j|5gla(3nlY~ zoVYOBVrH#nMCM)4ZVKhDL*)z~7mCu%tr&l#P}z%z^NtPQ74vQ-9_|FC;8wjOWaBV3%bRmnkcH$PgP+K-!3XzTo>UhCiyZashSj%| zt-jra`X&!q{7a~>d%M6Lsc&H8U}NKnd?VH@?mN5tb=xVIIIi(}$ndZT4Y z$K$$LMl~7+ma`I53yTeE#+<{x7Kyrr8#t*m`~Klhm&#yVMO-213=|}st_h|LT(N<= zV*s}gk440vLFis_m3zGUFV827M{|C`*u1e6OkY;)5uCA}13G?}hib?%V4BZm>KxCzfH-aWhL5gi$RuMS8EmZY8t} z9V8c8Vb&>2xLDAVi_>Yjqqu)!GXZrH!v&oJZe$PTd|VhXN+Cp0(cejuzJq&3ZZhz! zOuPDf?!wQNNC>cS1&Mo8#CUgob4v8If^kcZkOVHd43rSjLyR589ep2-wTHXF)qQ zaHWtIcbDV|8QGNLf=1Cs9Q=}nHs$jIRmC{c+BVK=XfnwdD{2Zkj)>-BE)&fcYeMeC z8f?B}YHjI3BKn&0zZjbD)hURO5T5S@cB!1$Qp>m+Urt%)>18=7hsED!z01pTHuv8^ zA#OQjNWjZ-#b2V3(a4`4vS}9Zd3)v9}6R2&Zb|gp;j)n zDcRKGYwD1+X&GwMQtGA?NjIIvMH3U>L_E@bV3aM&*@SVy;>ZJNvRGf1f*l1n&7*sa z@8jukIpUW|4Id)dAh*GEGG7#L|Mt@_Z`uF<_Yc3czhk}OQiBflx}#rrsn=co`ha?U zV1OS{?+^9+eG>e!>EC@sHF#vuJ0wTw;31BWNFbdf-R9`45 zkbT^3A08h*K4|YBKkgnsrde>buiHQFcK7#Lr~RWxhX=>UhmYDMkw=JWj}8uwjt>sn z$NR_a$A^cVBbtGoE|U3iyK~U#Jla1vY9Aau?(TPv_d7?Aj`tawox?|u4mu2LS}&No z7`Y#`yN|m2M+`#y@&2QOBLcb z_YWB{j}F`IM+~jU?c+y>``x3*kJ%WE=Lc>6zx~GtjJ1yr+U?`Vo&64z^8VuhgAY4K zDLM@6<43Gd_wnO{?&0HOF8gCf$pHh;q{W6{tUBPbI^@3@R*xA`OfmNlk2(hjOgfA- zHar`5|B!Ky(b?`iI%dlDsKZ#%-alaG@VMRH?>stu)Op0z^r(H&jPMicH zXloIU0Wm?h)6Fb!oCOk`;6N*8i->2sgWui^@am~z$)xAAguPYtvey*7tc9Y3wFuI| znklqcvoKn$!=(HbW;mf>XT=IAfqC#+EZ|pc0gq<{w-^8JP`VrQMovG5eMUbvZ#n%K zIT`(q4m>=&S@dxYMm;IEwD1f{fH-yl_#A3kGbn|{p##I`R?C_eDb{ry7(VA(*7QTM zao?rI=VHsAUPzu=ECJom5QW<*Q_~KeZkdYKak^#d*}jWpu9_X|=(4|Fl&p_PsNsif zO(60=?C&RdoayD_7ujoIi30Rs;99I5vi^BG8kLYonLm6woAtzkV_YsiOxZ%An)GJt zH)U@&_`q+!=zUl8cpJF?;#0Z)u6WyIE6X`sNjBJDZ+DB5`9f%DCdLHs7$Yn=KXAjRwC4d6#DgIZ*lQ`kJweEr-_4qId3}eCKP6!Q$<7(Hs3V z8+Ip1>A3vgB6lg)tBfzbhoaDr*N61Z<#WhuGUA;6uci~(pS>&YR}+Da zwcZ^~o5crlF9`Rt?WP_m3ee>u;CD5|F0J5C2>1fzMd{oOzj{dlU`_vi?hdqV@zt=_I8B<*dnXqxV99YwL z_zvq2@C6t4RA=J#4kdIGJwR!2H#U;!#s=&-T}>;YMFp2&gSBJ&FV|qUBT>=d{Px)Wv;`Hy$;vY{MV`ir8wfNQK{^9St+Cctc zGNFunD}Led*t(q=*l@mj=j9DK@rrhF*RdY^>vtk+dc%kvPrsD^U%8$KkYUDL%{i)& zMIG;F;{SFvV6?HLMYmDmE^>v0Ly*| z^bUfDhp`}ycOG(5VHELKOEi%T=0aK(*A%vFAcaAcL=~8=B)g z4$F5W&vy`K#B<5top(0P6{ES*G*|qNiIt$Z%At4;PIqesqUc6q+6~Bw2?qoP=#yeH zcYOcwdC4Y*Nl-jCdQx0^+=kEwq!{BJ@m(9NFh--5LhnfPBvE=kf3xh*L(ahGmq11G z<@8MJwEO@MVJwDd;OGt`Yxl-8rWWX?+=b;3CiWylnlW?Dc2AL= zauhS$0qw}`N+g(?5U}iRU;>sD4`3J)xna=r$wxjzd?_g=c~{S~2*|c|He^%Svn@St zzxvazg~43?-tpxN%6i{;hqz#$Prj5hQe}7LkAF0azdx}pcFiny4I@AND-W%}slw+j zitm)qRl2N=XMIwv?peDQFZh220?+432BK{})wCfxH^$WWMpYZ#CKUG5NA;t^alw zI+ExT5zH6i#TsaZKUd(N#8b->fUxyFbmw5u&|h-BMY@cp^Ja0uX2+t%7J2{R{(G%n z{Ud-Y_No^T)!PQ2j2Oz+6T82$$_w?TH=IKc_HW98U#JmOv;bd`;!lAy_8#RLwsScd zR)E3rYp8NJ=n`k!kJV^V&J^b;w*8M>8e_)&y*}fdS$s9OCQ!+2=wGv2niAEf}Ii@C5hzKkx-?s#QJ zD9_vJb3Leq!ELO-?rzl;Tt+!DdFCqASwq-Mh=1E9=ve)Xvnr;ZF$PgfEN@wPEpZf= z<_awBVnC!ztg)!|8pCl0r`dg~on`l9sLBA1+2Ja)W7xNY)}br)(N$RzL9vk$BHEb9 zJ8QYRiKb<*Rd02v>a3rB?}cgzoj>R@HN8L$5+s(V|DLN;6oY}t2M2hQQ1SC)z!J5{pMKb;x>B%p}DGgfKDy76Ce-HkQW zUv>Y6i|#+*n)`QMa{ueDxc@B|+;7Uyc8LFDHJgjYw!Xuknb2F?nO(2u@C{T=_= z#cf3?*_sm@@^+)uyeS3wL}(jd!SLvS$3?)`wbJ5uNU)fu3_!Ku-vDw@zR=_U5oq>-D+*WLY$ZzV8J@l3;lrYD2fVy%i$mc( zcU&@e&gFYa9sl_*KqAof(*;T1ydy~|)gSY&deYTXpG(^u>S@XjO_ylWg(h9uu*Leg zl44L8*=6V5Icv=S>MCO72SNEm_>;Y{LgZP8$H*9jIZQEw>c3gX07dWiO+R-4JIbDQ zMT9-umxsTI@M+d%@l%rlg)r(Go$F)0T>GwQkOvz9 z$P>}m1hHhk?@dX~$qO+jt3#9vzQ})TQVG^HPdwus73iT49jQQYox+f zWG-5m+f*c9^mQdpX^zwz4VO0+KkyvSC;6}H$Bio9AUoJ*}oBD!NfeDh-f7{ zT637uSh<%5x((KDgE7ZwE>)2yB-HP^C;DMJW_pk}?49wa$|)i6JKO9xf*ccAG~Ob!(Zh1})5YoA#@X4fJ+FUZp(@`sAwP@x zrSSJf@uVR_4#xd2lu9^J&qp+E@>!-5yRb03-4`ItCOrga95CLfm-#5OKhLd5($rfcOo@{ZngtidR31#=*s&k#WCCK$6dg3+;BS+8^F% zmv$jYk9b)}!xVe)b^yHnZr7^|X?sN>JdB*eX1L3KseqTeC%}^(%oG5|9tnc>_@}2~ zY>i7uRNTz}NcPM7f5cI5(1LXe+B0PJ#$_#{wP9zm6K0J%{^3m9fC#WHVBDIfO$^-Y z{D(9009$?oGuKMxTf2JY89gNoTR$&j;*iBap>(mVEhOWwK=SxnZL3?RlWUlReb$&v)yV= zvk6&+nmp|3uhO$0IBM>kPwa4fr9Ym|N#4_Xz^@@iFVW*@w89~~*3*MytjLC_%~7eJ zzWE54fP4?2m^Cv;C}jYCcWhobJH#>I;v{=y8=L{`T3iS=SRD^3uGer^%(JJ2%GILp!OP8g{=zft$zxg(co_d0rcR8t! z%xPwqTjI>Lr>572A-v)ZN12)dBfZztPVnH1Ae__C_@b~^vvjy%@T$5zecCLZ8P#a; zpSz$R{O41?rO5t$=F$y)xlTW93uQ46I@#KTfH-P|poMeE4ZDBS>9yp);S75JkD&=9D0qR>%;(GT_PXbTTPQo))&?3cRJ8ngaR|sHm0DR)K=3_MEt__&BbBiZ14s~IC(wq3vW*r@f#0BV^#6KNTHBBaK zE%MCg4f9Svrz#m3sGlxk#$r*y2S$o%Y2|LHbm3(=?lY(Lp}KrN<{M9Qh#acPd+w3& z8bp4LeIg;@t&HWp+uva&X~r5m~wLbR%5$b(cX%>$?jG*~Z-#B-|*-pGSa|GHAHzi?lr^|Z1+`cjR8aSP>}S`F zHj9hdbPVxgvsg^2Y$b2N_`jHvD>mt)pb-mv7t?ow(b{R4imN$bAgiZPhZCm->&qK) z5aNM-dcn;-DX{w3CcxGVQ+L2>(7H?b{c3&^=AdKX+jCG@kHx_!Se-ZEAfw?s0piv< z$QndBDBdFunws%ZZ?PyRcvUEZ3a5m6SPo`oZ!V+F4dO7dO|_>6)V|4Y=Nl>wt#(-9$d+B&f)%nu_dF5Y^}4@dQGrkw{E?_#3a{DBY$o zb60+T{~Wg84wSGt_-giaGPHX?os~bZdF)GXR8Ar=MG^*atVigItEpRW&m&*}J=|_sv@HPXHJ&{C0Wk#AS zGW;waK;v9H3{d1T8O$2+L9pkOXp zVixliD!5R31Y4)F$bxGGaJRv*GL=Q34FZ&_NrGiL0{dw)D076?(1){xO*lSAu#QX4 zVjBD3!#1A-1k2c8{7J`fPBpyW&=8={ZcQ#q2O&8ro;5HJ8R8D_s2zZR{SmZcC4h^`=0ltR81eK{dd%%`Sq@^5cGMZ5IBe918^}VdjTDS2cvZh2x+rC zjp@Q&jXFU!uzTW094^1}X@0Jsf<_K3p?eY zG0<2S49k(Bc$k!=`U+y82?j%okhGpqX1%AdSZ)VD+P2 zV_d}9V*Vz40J81|ikSu-jDDxh6N!b~yWjQPjEh{Vz0J!gQRkQ{R5pO}_bIep*`>B- zyla5p8YTDYk(~K0tnI(O3)J%!wd)%y)wCxqmGA&C+)o;Ob;DihBh7;i=CB59svMn+ zC}p9Dh!n*R9EgLO-h8K)+*<`$0l%iMeGWr`_MzQ3^wefD;pXJayYO^Ac2U3Z z^*bTm59N%>`|ezyK?`{^PZ3>&$zBa#e_ejpq1p3{_MUdaH%7%?!$VF-!x!bnf>((O zH^~b`#izrb@;eAC<`|zk9`k9^LGXUAi%>&x94{KYMN`OmH|-CE$x8sV(PtA7zQzn= zsPIFEhTc*wcWH}LEpNr<)W!&0Tha?+`6w<s^aC`C_bBUA_8DO?}nm3p0ghO8YF%)Z^4k;(A=U_`mKBiDZjgP|6=;$@isgoxjWR z9Qt$-xzDO1ZqEmxDw)D#v8I<%B8hQrH?*s2Pa|;qByz)V75g3UD_!!&^T>rN8`guO z8CigLHz$aR1UjZ>5==tvnFOH*b}dm;Qwe(QkfNKCDj}NPNd%XPmGNc?Q3U$u0>E7R zJ-u{5koDZOw2pwERxb9L=i0bmyEQ+}h1z#K^a`91<)M{Jhqqxrt?m90m%Zd$IA3p!g~-qIYVf=bJ_4=k5)nH0uurl%!+R?)0i%6) zCjLd=N>ONoZ()2ScfZ6Zng24WJ};x!UB9Nk{Oo_)`L&5m$d}$_j`kOwUpsGu>~YV^ zpj#TW$~lH&J~0yj`c-qzZMaS}T+eYaar9O@`jnFkX{}nV$ySI0nJ#b-*S8F^Fk*x> z0>avcu#Q3?aadasUSTO3J{KhacuilX>UbuALHQ?2K?#=?SGqipfOgeAofi^+S< z{H1thJFi{ZZz;->RD~VdZ$q5$DT=0sT2qS04&}NO*Aae`5GUWDe!Z&{!Cnm@u$({q zL*s8h^d>*ee)#P22X6VuOu+l!l2=dzEbG}U6Tky(!{C~QX=+v_JxIS><(xfgK7`Dk z*sfV zl==uN?H4siC6;k9^0^4+^`dMX%=pXd9Cso*Vh=f9-mjAw%rXj z-yCJPh*@b2&J}2=!MEz(17A4u-k9&3npgaId-PjK@ox{KPY?eFUmo_bfX~iFF+sqJ zwJ6LH6}xNqE0ugO)8I_DFp8 z$zaVS>)sl9ZH-IfnQCfE?^aFCVoBy1BGXxRq-j>z*PDuZBau6xGU~)>-&QtxaesQ$hV*M%`@|jB-XW$x!dDP)OVM0Uwb!9BZDf$Uh^+g zIYw;KEC-uwA zy+zPKB2d_TX+7a<2o9J?paL>Bnt{~H+!39~TdmyH zuOckIZ2e)inDqwm{iRn7Px%28Kea~aviu5(;}j&51nMN>`tyzy5&_YMQPAdOota|n z&`7vSqnCtn?5xXzF2xr~ov+cWud1)*-~X^bOi#{TxA`Ud2;}sK=Y0V9!|L+m>DGtT zVPZuFj=n3rmNle~4ca%J;k1`O`x!}?4Lf)~-;qf|D|IM7+zzkA7np%$%jrq6F;VSs z8L|IdSWQJ#o|q69~F_{Eo6=Pr=RSbiaDT@djylk zK9^$gn)*nTsMHa*M4Qmxl?nY18BV7;>wL6XUIC@>ck9+@@N0{kYYXZcLB)o#Hpala z*i2R*G*^|3C}0A%VdGd+#}~!rs16=gL3ZEaR*`|KO$L zztl6dCV`eHVJ0^jQEG{=Q1%dc{Dhs{gii6|pXF@&Y`UBb8I9I^DQWSNxz_X;!dibkhl5d_~J2WmX(JXo0*S&VV$>iO3c|KP_`Gyf|-E@zgKUd?}4XDJyi?U~st0rmW zs!0MlfCvLu6ACjih~0p~Op;(O>rqs1#k}Z7AIVv@T+e2yq|hJ^9NCJi39Ma~Ym{?& zEwo^+Y8oP#hA{lOH(OL;9Hq4a7VJMe%o+)_S+HS0-GRsaD`w0{`ECt+6d*wx+HXJw z7eD)tpn_5vAjElLXz4+QhChmH&{m{GRfZIYuPuTO`*{tKNQ=39GAw!cb}GrRp4X7Z zkJUu(!{<0is*XySH<2oO!lrll+(^{CX~7s7?uaiT*N{{o)1*tzR%Wd?7PpVC$TA%c z1@wotpn1h{QPpQA-j;t1Sin}iZU|i2A_$c{%3=Ad6T9_F5J$CENXCVjF$I%C>;>|D znL;Gh(rB;|Vy>Rn5u&(+HzGuCJ%kVqE=eH*u8t6`VJ!)=)>Kpe+!3O^#rLBO#G|`^ z_IBU*>q&214d5&4jA*Z)42GXi76eed*;ual8>s-i)O228*zn?VHvLi!nZyy)rq%3W zwJ68#vqA5&H>ehC=ke?Ea`ykX_qFX!9Ls{=`4tmB97{oHE!z-cgY!6Ga(phqTx?G6 zuH%QRmoW%r$!KI_g4y4`T~+;3)h{z6S%ze9cJB#RPj_`yb#--hb#=8@^zZIyIQYpc zER-GU746Ktf*0puN%1yP^t4+9H7940(p?m8;7os{Y-REB;m)=eFmmr>5)>fZgc5t- zfKr-tlODJlx2=E!ZFsNNmKbKq(m{8owk}=W`7H+Dofi@F^m}E-K{Idn0+XhhW!?L(X;0ca?7N~FX zRI!MUDp_^9Km+B4Kq?d{#hmT1TLU;2n{q6+I4|t}deh{fIBXB)NQOe z=A1#?{BLz6g>53K6U-F@v>zepW5E<0Mpmvd*CCB+b~40U*>ccUT5x!xc6J#llK)2J z%0@6I4odM)Mgx+Jl$b#U_}l+(#SJRpk0$W|MpM(6WD~2iHL)JEiD#-C_EIdq1-LEh z-{lg=1N3>NZ3k4>bS_M<^CvU{&s}MQ)d-SNDZ55=+w9(jn)aDcS%vQ4;;p|G}JS{tHlnowCUByymID-%_wgC z_pZC-?9D_8A~p?;X;G$;OBo$-XMs7npjON7ERo%qmpQHbaGj5+J~0q?QUk$Zr$%9p z5%{JouEV;>fNaMG#F{22w(GS1(3;8cDNseeC^uuAj_D%29mv!XONm!w7R1$GpnTk3 z;=e(l)IYTP!;gAH$Yq;#8XahW8eY3n1Mmd*Z0}$ zi`DG=|CM3FV8_>{;Hm-pcyjg$B6u1xY?|}imXQTZY(<)GL&C&OSkL?vD$5=ij=F=W zEL+RImtz|hDrqjwU*H}>J zN#l}URaAeh$!ph_nECl~?N%cC^zr2M^nBJuyblfDuUH_8b1S||PyivF9uW|X>17A| z1dg>Dv}tILGK7V+84yuIc8X%s9|}S|{C&SC>#>#nQICW_{IW|Zt4Efq3I0)!xDx`a zN!0XepuPb9>tO$Rd*{U-!lpBPepOQKWJYk9`>xo`Q0o-f0z3#kRb(olgYl(H)Y3P>qwK~52n0^HonAXWf$Q=4}f-fq<2c2E`i7&(u03Ng}k^Pz@SdT2+6 zNE$@k3Ac~x-gq|gF>PglAVY?sKFY^&+|QL}Twl|tKvp;Qih0OTz~gjiECDe`iZ2UK zVE3yBr>EVOguapmAkkIeh%>^YOt;ub_(~{PfurP>^nMd`R^W(dg&YzqHeF|oCu%0l z=?UMRPA60DTmQT{7#7{$D1SZ~kA~yCJKdQMXK$5g4EtZ)ocmev?qCM#T;Sah;4q~2 z9;;D3z~?ZE_KWVct6EKmeO3whhaS$X|F%0NZ{o`83M`&58m(-l!+)&tAM5!%34Kkxlo@@Iong z{CLC)kNU?p)%NFG(Ni5y@MfRRazsfqcfPL*-u1sNf{-O!a)Z5X6&}4rcDqhX!8x7ffD@z z2>Xm8&JUdxGw`BUXXg42(x^$CncI?<3x%wAz6d*gsu*lK zJW+p_sD(4NPEQ6>6O7MKLzuglX8?6TioXVAetA{`F_*xK;hS*{@XycT*?7~#7=M*? zaylHJ7a>?o2(9!6l>q52WQO-a5zqpHqT0@kfymUg`bOI^mHDm@6}CgQ8q_qCX1k$?l|mCyvN>n-X&z;>kXc$LIJz{f_;=XB-V7e| zAn@QR4VkwnDYC7r47x-%qMcBMW-SIC%HM_fG^)!;1xV(lUk{mE%{t~r#%Mw-y%Volg=Gt<#) zLfmFeH2d+R;$EZ)a*VYg4w7v#ojRR++MV^^l5#d)9gN3$em)vC#v&L8=g_#xYyCW# zj2gYLR!`J2JW=f6HCeIj8QFmvgw+E$K4Wmk$tUZB{k@yTQ~Kw;20 zTo~Dq3*LnpS}__VQ5Q`%(idi!iQ_t;oL8h#xyU}pSR#Jnch3iYbew(JN)n-2lO#e5 zTapOV-Uwb@BIHPkpPYzJEh1>hk~EO?CrQw)cP$rrk&> zD;@n2mNv2HSN3uCYBn6vN>ivU4@Fzev1$KB?W|9`)0!Ko7gN=2Is=bO%u8!E@9SSD z)3dk3;`H@PJrdf`?3o(1tj)8*YTDF<&z%xW)UvYSnV%L1<}Fk`aXZvr{jb-y6Kz|s zTh#*OO93JKmkD{u&Tqm+Hl0ca*dc{IB3!u`fdIAL;w-f7}WSHESB6)7S!;f~TlU!Uac}Pie_!;^giNC9k!Ly>nxji3iSBdI* z_|!=>DPa@5HmVu|dMReD(#JcoZ`AOXbSSLGb59=~Q(y2={SyrW*HtZE=)zII%xf6% zr_Rl+zWP(aIHeVyUvB~9-frpoLt_=zUfsI=PN%4Ye|$6GU11!7FqWT9lf##3C&`3^j?R79XnN-f z=x4V`20$8cuKnupY3Kgqx4F_z1BBUZ|B}!4r;Xc>C+DNVcx46`VpVyjYToVKzwI_a z&0M&GuEWXmuBr^?{ARS_f!V(kjdJo_sb+ZJ zb0a#btdCh$vmR!SEg!z~Q#gg_UJfUxUwFQt7*dEe-P47A2vx+F;RY!NU=vnb3(Q+s z?(g5bw|-xZyPZHf`Sgp)#|E1n8Prw+VmVQflCkuurB~yeL;yL@gb4C(cc&E8pwAxo z!@jx}1!RW;$Br{~P1-Q=hqYnM?ouyY=U@R|#K#(u=lBQ@tqpZ*Lsj<(TjH_6%J09g zI2MWb22M0wRf~GMBXfUd*;B5{4^WS+wFMCZXmL|i2q}ohX{JJFs zsO7LR(gMMCZwJQ=%DHYZFmss>yI`->r@hen25f=Ue;xC%{KqvYSO4|PA3*s7zqqrC z^*cfRPG=QAtcD-3=gxZg;XZclmwQ`h1`r3slFII6tXA{gjWHYFwPQ0BagMKXj@ypI zhb!Z)JG`}sIQ z-YP(nHfF^-g< zB90ZUbz?h-w1gQgj#0C3#%(y0{i&gl)Xxgu9g~=kL)p`=DKW$}n&;Z9GK-0Uzt?6TuBVd_ppk*Rgxz?J~`c!W(1SDoF}g(W9%V&vKRTYT&rqbT}U5AKLOE;Q>FAP)oYP z4{x}sakFe1v}eth`I0&h5vZDDku;_}7HL8JY9SX6bon52yl%;JiFbwe{g@L8E$-_| z+?fmClUA&$Lx|(Y6kY@Tt}F3&(Sr-TeaeImcLF{{^NmB(x=I<)9yHWT>}vqcIQ%)Z z=)ngD*#k88HGpQmacHrF5nO=*nEM#O(w`#J$$Gkt5NMD095P_1?<{bF2Z3+W#}KS! zp$kFDefB7mNuNK=lUBOaLGf(zri)>38Jsql__ww#4qGU-nonhIEQ(-G0dnC7ZFT7H zFr#&e4w}-x+NJf9A$~!*xaFR7(F7mB-IMSD)e0eu?8)oL4kn`q$>z7wdG_a;{JAcF zZpfeaGq4O9X?v-5W40-0+4C3-5V@XM6uS*8AgF?@waA@5Xw68uWflcWI1gUi;VLA)?C< z5+&bKnF5vpqRh1xaT1eC6KOvpiax1mdCznQ2D^^!2vP0M@~N_}yYxoSc|PvviXEX3 zmmGMs6IT_O8wq}a(NBf|{JK1YWo!IqcmFBmhZ)b{amfA$+)x;EZ&T4UdksIDyzN=93J3u-gF4Np$YrW_<66Ap*UQGmOOU&?Tr zsVOkXCMTL=ffyf44n-H8o`VjZjAvanMY`~!N>>$3#(6e?Ng+XTK@b?351INRns8y^ zE%wG|=g=A6OdCw#YUyN_ov5h^Xk_bacYDJb-2ls{0wNPQ4p0{d2uP9at>S~1tf6(w z4o|WkCQ?GT!tE6pkfRIJk6sFS>U(fLnL?Im6)S)gx7OY`SPhDF#VVf`{lpCuQ_{Ggrz3 zelljGH^=NLpH+VcG3B>^KHER}H9wt9Karj~oJ^i|r*HDckTQv?Qqm6aVFG(5t^;pC zv2ctyxvCtvc8Xv82@_x~88yoxr|4`l$wp9%REIG}_fNpRGK_@8MM&mwsS<%z)wDud z?&yUhr*~v`4!70tnN_i^OAlL-VcxcY;+wl9sMvzJ9b2#UW`bS++5Pp!;s1u|13L)C zV)9VZ6W!X|y8r6uXS@ITYX5LIthe&}ZFhgiwRy4oa&P}hqlpZ)xD=Wz^=&#~GsQ?|Z+n&R^2)a| z9%?q~j^F=e;&EM^14g*6ufeNS_~(!Iug1Yf@y^5LP3!P*Y`h6UhCtOdmt>%G9`K!<6Y zt1*-jdVrY$uPFD*EpZU>{MEB(I`)wEz+-;1?VSG@#ecXvZx9h7V9j`oX%cWAfrarD z0@w*}(oG^(q#(z}<9sxVjI|qE2-H;!N=nOQQr;foMJP^$;zJA|2Lkst5jp0U1u^%v z`VYIFm%<3aEh@hTm$dwzpGH92K5gXVcNbdzQh?Md80DKjK3ZLA!dz`oe|RhWLWk6R z_lUE`cLvt+$CWspaN&B_r){G~4>7w^{o8XB`+U#G;cT22g|D=Fp3)+yAI>MUJOWme ztQMiB0Ls=Z2ZU|~rJ=MvAhd|N_9Y19#B=+5*8|0{z}rq~NSj_uT=IBp@ERmrw}RGc z4RozX5OP^U#%HfNt%|Pww4(hNul-A}{YZy=rXd`~Fi>luheIih;}{kK1|HF+0o*mC zY3HE>hKsF(1m}@80O{X%N&urF<^cC_Ee$~1C03Fc7;j=f;jUGY1qMh>93X1 z)0cQ{)|N_ebXSWY(UI$wJ4~Hn5?|4~S(xuAxOWb)e_hnj?`-1F$aOJX$E|Ix8yO$Q z!#ht5ytoOVIp&)U4UZfb1Agb30*FA>|6T%M7ppuH*MpyJw{$|(04wZUZ4yQOmyC{g zW3_GunVeRevnYg+@e$|Wrn8H2uY_E5ZGG8fnj)% z2aMLd1%N@IqYq3COkRKb=$IY_Pym!wu^;&bR?r5bqq&4Xf&q!k={I{n^W z#{@uXT@X@3ONA09cRk0FMF;9!L?3GH-f~^F^m@@Un%iwK>6kmxUj40);QiL>3u{jo z5DPY&?Gy<551O%7rL}d6y0D9~1{`=;&kYDhZKy%T@DH*LHjR;h;Tt*tNVbBI7S#x% zRX}a#6sO{%h7!%j+DR!RZ8r5%#M)8ZjZub(K zx((4~2x^V|gSb_Q+)Rc5G%`Z%Lz8rWAqP4_UySN`|9qz8My*H@--^LU*J(e`)gl3V z#E048Z~Lzg)&Ko-_x1W3!cX7GW(O6UnfB+riv#<_4b`cBb2K9C1A~fqo2^O~k2MU8K?|+YHEByT_7`Dhw=CUArjm^~+ z1w@k>X)j#|2$HW;DHN<2xseWE4MHaN18%GZQu9b-&tmeUqQafCV-un1iHhFp+SnCO z7J>-d%JDA^$WL8T`ody-Y)UL0S;wXk=`qO=p>^@?D-b{hr_K3e^&reS;558)-rngI zx@Oab{Yga)5XlZU(U6|r27rpE00!dxToANjscy}J#Br6WaFA~4RQ`4$5~M-U<5msA zFgVghCdtsuTm)pYYO&B!Y)7%9k!%g`Wd@)N*fMx2fb5{LtqN|Clrhwzt&%s}ai1JB zpMVv-ORLtfMKc~<`Tl~Yc@U7uKM;xs(p0bSA|JXfTkXmS&%yJSYwbYb~u-&SV+%TxtG)J>O^aa!k%r!8U7@2E8 zE-5tEQMr`ZTmxVrWEiM#df zBv8fV<#{_i(~p?$K|*Sn_Il6EVHTHRIKd;9=Pc3S(uQT%% z<-LLTnIC5BWWolu&u_y$E^l_~y_~p9>Z*B{Pg6tg+&xBz#Kv6fGt^CT{-4iIqSrrR zX?IsKLr+)y;-|g#`N&X#@XfVQ?>ejNExi0$r$?gQULp0at5!pp%lj7L-EjOf1ybA% z27|5JP8J?0QMiqgU|QbEg0Eh-BJ}s{k4K-dqH*mA?-HC^;9^tID z?tyb1?}ERJqv5g8+H$Rk0>{q@z*;95Op|?xmpg_sn~Ik)MYFz83zfb9fO8PNY4K$Y z?(~zN&4qJn#T{?3SCG}IzBZKo59hT(ONT-ONQ!9nz%zF^Av4`N=wx=X3Lg8Spo_T# z6`@RXmssEn^Mu-nEJKwXTOhJA@6?g@u?i{9QN%qMdHJnX;aBk-Dv_D@KL3<(r{IZ) z`h@nk=TU)H-i+HsTrWf(IA_C8hT}$&pKY3SQS2p6f!lTxSx9D~AL#Ov4jZhF!UP29 zL>x|w8M+1Wp|4fSUBQ5Lq=OLaGxwmHZ`j-rp|QtoLX0QW4cH!M>c7yaJQt~OT=*V~ z$Vi=5fRL9-Bx>QjLue|Av)WS%?2d`pM)Dj6~J_Brc~@_98%q{H{4%tS34&> zuf)PMDS#=O;1ke2-mc|ea7S!)wR`?D4RHjLnfJkFH&(8Z=8|Gl2Ub!((ZLx3Y`f8o4xV87&k!>#R z?H`{{3;#;lye~<6jD`JtS%$P{ml-_GeF-u3Sc69|!O@f<<%JGd>Z?ij6rSfIWSinC zW)|QIGZ6uRA^cOL4>|OxiP9Zsuu`)Z0EBs@s`4;esNBF@b^U_9t6<;d@_Syi)3$8b zbk8M6Xd!Urc)-o!+33^a_(TEBgBQP^LEWm6JSz+iueB@Ytk6$?<8K>2iFMS{-GXbj z@P97UfeCLbU5BHT8r@k8)67kZAb$Ck%-V%QagJw5R zwJ#0*eYNeccePDQh9L8dijs59ECndc`iGhPT-sl5Z%1arYglb*&J@--@8xgE-wDAr zXUZ^}xu5xXV17uYOvigP!zr=|T_$)rAb(@GsgDRC`we$b-LII#7TJX0VZH-cg7FAJ zv(LN!X9b(oW&y9<^_d}lVqe#xr*)XF5pzs4=c29na?w`Zv40eFp_{`_Ox%WvWeNM? zi6vt`?g%arN8rNJeFh?Y)E*n^0-XFc3gX@=Gx8i{HErq7AC#y+mH$aZe@{#}zlr=Dd@oZCX zZRnY^T63W|=4JQL9~J+1ot&FR*3XNJWdr#EfN`2pO$m43`??O?o99fCdJvGz|5wS;a8d&N+}jKn**65E3f zXCOv7wlfnzH_iRiG?B8@A?7VBXa^xKrDhNUA(m9pC`{k^sH6_AORJBjPcb1F((EQw zp1()+Hf3AeS`szI&~lvO!Q56mI8*>4Gxpt%fxz=%TRyB}f>474N7fC^v&rN=Y$9h6 zz=1opy7s7hBi)VA+P(XM%}FY2mlj!p+#?;fVX-sB5)1A37zJ+B-w)5=jLVL9!+Ak! z65z?)IJ)!l=o-@z3($6kD>(BpxH{XmN;_^oI!!N^QEg$H)#^?*j%)8%+z#;k z3(feiyo(K@_p%nYXSHK--CA++&~mK63%-wIXNkE>#;F$EAtOfwO@kO zp-$0(BYYBmJwMGu4-@S5%9Lz!KvM%5Z>rR@LDIu?`cFulVT_Fvo`yy1*ygO*0*%h(3mr}x2OU3^QVejc1>)FW zb?fcog4bVNNG|G5bjAhh$r&@Tbr>tovjkg2iyERzHbl+kw7%$sO9EfYh59Fjl_Y=f zq@lw%@GOaLj@~3M)Py~2FpH{rL)^K#%D(eDS_;E{dpjKEUyWzNpGkVic{Gc*b!wie z?zJcLTX3t*IHOqy(Y>en?CoSAmSDtq1(q+g%JAnF`wqsd`KbOjpFRR?)0lQuC`edO zYv>hAx}s~WfDOBfIRF%D?LcA<3)-^=S0Dt?RBDUix+W~n7-MpW+~O|)A}a`WsnMbrMmGbMcSrDy(g6`l36X4ZEX8Armu3RW-8| z_n$hE74s@Gvv5RkbYMX0&a%1_3_~laNimbN&L;i%b51PDmzBsYi*Zg$*dqPMyl*lF zH=mraX-wyq@{}5{{!YfZ^SVHTyB%4}9ESruJPbF@==59aK)#1@V8lF8ilOhgfb#o! z6R(ofV|8C5lg8>CGkfam9(Il%>nkzqY=^1oR}R%p$dwfjuIA)tRupswGjoeo2x6?^ z|JnJnva%&Ul&NrpCe%3{|0mffkMLEQp5s%SFoE-4;C^!rF36FG`kljHnY2B~aPVlffr!eL#0N z!cv+$IQ;%HXX~P4$GjXD1JOdWjyXX$1_VIiRa5L;?eMz+9bcc z<=5~6#!)jQxeROJH<^$zF*@Bj`Z&ZS<>x&mx0tr-wy+3x#{-F=7#kfMtok=&pQNQs zf;?KRAW3o-lO+dxcRWb)C&|k%F%@LONb5bM5S`!2(&;qKcWE9Fz4C0mS-Y zfIx}XRdf}kb~A-!_rrP4PD}9HZxowIdW<{>oBGphDwMa7&b0Z1#sUd9)oyq<8TlGy zuQ_(~N0zL|N9*9cm%^+#@4>mXsSw2v>VzoTHjPLOW-Dt15xo$E17eW)7A0;iByK4I z%=+$gSqQU^nzqq*cn}_}g+^iF!9V1_iiF@{bK(_S0)3f4rd~;5V2M*><0s<#3^3P& z9-fo2U^c9_oR&k{$ zCuG_ zM^xWP-9uOFgZFCzyM;rLk8Cq>!Z;`|M7@N<*MSWX%qQ-ARwK z#Ar4;#Im^tDbrwZBxSh73s+4AOKdCsjpShuc(A6{A-bpAH_PZ-LH!noSWdV+ea~a#QIx#)!>nRd(v1(_LNX-u$DHkHN6-S7&nVYDk5`@Y_l{mUTHTt#W?EkN5y(LGk zxuo*^V2pHnjp((~xHT<1k0)oJ4kwL44vrE`1-rCu%jO5$PZ!1%X?uPlmYan zqwD8w998JbTpFGX;aTRq@T1G1h|;vc5@YhR7`PZL!7pG&8@l@KHeJye4H~KM!L|e? z7MK3nB=bD;{InsCsks%RkvwX*t9elt!JmU)sT+|ZY5S|_Vobz zSoXOM$KbDs4j9@91>-&JPDO20E>^tA0x3N$y%D0C(Re3nK(`bwRs>yUnf9aV(z=&# zDtryewhL@@;%c>0F}A@J0CZtB0y9`Ivq4@gxSYWsu~&~q+wFQ}p5dwp1$-UD?T!9KJ!QmR=H+q7xa zHXo&Wg@*q2t?w%Q#45ZR7hOm!Im-uFO}|n4-J|T)-t)utwb#Gy{1>;oYG^y^NlbcS zy76r->+%sE1XI!I-QD@=dRLDHj0=l5H?~AIp3QeQH@h8<25bJk8L40Xlp8k$?iW2 z0!Cb;Fd*|NUM=cAYYB9V_ukYqsck7u1SuaXuA+NcPpJR9ZMa~H>Y1zDk;!9k;O@Ns zs{V*Xbe@b^;ex8Zrb*4m%l~%m6@UhzY7wAX{yJbwV{=VtY^o_EzBIQECzPS5sdumi zP4T6$$wn-K%NX7?@XC9|k)|mow)Eb@IRA+H=E!iWF~nr4b_LReD(Hs1ghfm_fn@I2 zJ^u28&h&Q6z9vY&;o*o?>;7c#s^eF+CfRxjNUe{ZRh@B=*VnJPV8W;?`7Vq1mQ4I9 z8Iy<3drBsjTTDJH%BV-g&VXJ=wG`%V2seo`l&f2eGU~HZ_WOqS!-6 zj=eeoPq66JTTOnzs6X3BZQ6(V|#1LSk&I?u_hpK=es70Z{_}wmW{4542{|2Os%3H5P}! zY+$b&5r49{x1)0uG&>DouE0pe-=Y?&%_Z9J0)g^*<;2jat->L%W;K6Q#^9}Y^I?W? zOpgs|*~Wb(HTl7(@vM8<_OhHi=CDHE?b7@VIxAb5-s1hnBI0mKqloG`>P!@>Skw5vQRoi+Xr}t&i7y z`b8V?%SFO{lY-2W?HbB0&0MSYmcUs%x#$j}l=`fc&$`NdTn>Fq;&|{pCy7U8Lj1GgH}nus zG!Sei!hsYoP0meYx=>bPnOUbI{If<-d%5xA9&srWkDnw00c~v-80c3uv7x4_{vE5z zj4u1hWuFaF+@{jxvPVL(HJrX6l(uJMVkv83YV&wS3uT*C?~cswf1cPV0Y8LwHdga zcSreYKAs)mG~CP%^=}&$BbBWF8ZLwH3V2nSksMnF4e)RUjOU;QpzZ4~evHKMx?tZO z3ND~*Vl#Gr72&iD3W8yi*^;G1z`Oaf`(o$i&f)$`ec2e^S#7y@R#`>8C_Nrc3V8Lh z5C7WeRNUg~8j(i(XW%G!2Z+a;#AM7o1jl7f^?c}+i%2Z9ZiqH*OwNq!#AA3cP#f}j zTR%z|u37G!!aP_e4o(&}+%2lqFsOy*2;l6vej|St#I3qYL}3M;Pkf`6;tP2c5%} znIaORKEa6?vsu*`!ddkQAJ?D?QGrvH`lJFvD8#aDX&So;6Dn}~yx`<;+8vID<2Pn* z0v_#I&;amEvAQ3#r~839%}?L47oJiQ!1u$+Qt(y4Ek8hR3>$(w7fyVi5GPNlqEM2G zGgPR~Sa(VYsha7*g+B=KS=0Q*to?p>)MuM+m(kuG;``(n@RlZ}Y&9dp#{71xj%fAj zl0QG91C2~5@P@%5{4aB%*_gMZ1SRkqA3j}2N_VeN(|OV#Ds%ZFZ&V@@7dMMWs|<_z z=v|zzk#X}Y+szmkb&@oRg%P^zj$Rct0q1LBb0b4sg>9<_=UQc`E|+uH97fLwQaWuG zw?9gtcyBw_)r+QiaaOigQaA!Us-o8$vr?{l8x$%Jwkb6iN~mO)K~oMd6Gi<-^q4iS zo(O%V9DHImtFvrq?{jK7A4vJ%6$E^T_yPP&3Go#*1JaaH^GL`+5`#{L)St>!#wtm zBR1nNy{nO(HHC+fde!!c8J9cRkpXy&bAp>8=6zZD(oR}!t&rX#D7J}s{8fYeym>O| zpBG>1!`6!l-%=XH6FW=$*}QsRf!h4^QpeXosS=|_aY~yI3}(!9NE4%#LM6nQEixAm zB;@iHzkD@M5YzJUTw0fDX=qh5qUG^HrlqNE1TDyt>gf|RbIjABUw7JGR|(a|JLdc{ z_*KqBp<5#}8|uE8D#LI(8|DS~6uo{n9OvDs0n`#YI%dH|Cu87$vfvU%V9=ndTQxQq#`Ziql_*?lRPI zkQRWll!1t-4rV`j57?DY6-m_;$OE{ zt*>F})ko*r{QBF9`=4dSg{$lc-$*K1TX%Ys^I3TSnWvH5Ar6Le_-%DiT(OGxx6j%$ z_5bxF6Ir8S<6R-iwvJ<^hqP9a$>x+_q~*h_V%TemJCeHFN(a$mH;rZXvp}F6AyLH! zJXxIwH8MKpV!`$MScH7G6nPR_X5xX2J{uOZ0%BAzO^AUq!iLEU%Q`EK&ERl#SzLL7 zd|4dX3hlP5d?)MR&59#d;rKYje9jkQeezR04fE9)@A@SVckVp9a^Yg<|Ia9 zG&ezufG=x%eC(6&)`f;`*y8XbUKR6iRaf)N!LhfP#;1l4DM*)8-7-DzOci*gfL#hU z^S#Qd$U?p2511Q4AV$?R*m4FQ8U|DiTItG7n~pqXkI%J;()varnH9?@uUfVYVvTDrffCAJ zeEF+M%wK=$t3UR^vKI()ttBtrDn2_FS?bshHdyN50O1;o+}~^4-)q~SXKnl9IqlgQ zS@pV=JWVZ^(D;;yIx?$8oe1ce%{0&uxi)|cD_c@mJQ8gCn%i}EmBF^utF+cC-D!6= z!OP>;{H9Iv85RbQ-tLS);Y|rrr!5Bp0?AgJ@C@lR^o5~r$9ot$gTL>Am6r<}Sk=G5 zA=AHm6Lu~DQjF6X@x{|<4q0=N#Y>CN%ggiOOSEhcd}cusz(_aIGwucZ4UaWq5SKxr zJmcU|O{uekMf{O2>UqJ-jwL=r8L6HDh|VYywBxS zhq>!fww%iy!odqnhOZlvi_AbFuUXv6M`Ip!2tLPMV`f?;&mwa)R31*B(pAV9lgKo3 ziusJ`!l>dEdRGVhH?^{48=u&|CscTJfA~_|S@eDN?UCKN;Dx&2`_$Xncol+^{mV9F zC`&{~pPj%H8Yi&WQawyvaS}#Aq2$`~n4>X})XUM#TrpJxj)d`}_Djfrt#7U3_o@4y z!p`aiJGmA|m1|Zd!ZAo(4z?HdBg@=B7|A9r5_>bq~9-hotdI);wQ4ds`=Z%P^n%HgzY0fCm z0iRU#f}et`f7APT`%n3kcQ5m9|E(fv|EZ{CtV%Q~bNrPLT3Js#mzS;;g=H*MQ}K22 zAqg>2m&5hmCFNiY$xF>(^aYb+G~CVMq8+&|9nU>y8jzy^Gte#N7B%Hv6oc-qw=rvk zl5|pjm=?eX?Vg#Pg(sh-_pC89`|e}T;F_=@W1l1Ev!7MS$j!7N@uEkId(i?+_@3&^p}CdMhz-s%GSHE9A| z?q3s_U=j&j5NJCm(^qgA58RFk3tx>-CZhp<(j8q$$0;YG6g)N8yRJ0sxsY{Q#U)uX zr$;mfN7ZA{ole~tV4CEjP1%xbj(|{js7_w+} z)iU2Ue<6~GFJJ9OWgfG@D+r57JoJA8n#X%88amr5ofGr-y5NlPJNlaQ!S=n}*?`tH zfL#_;1&ck+v=opa0n37QvQ&o7DH|sic;xO&vNwEErSIQ>Okd$&fhT+VMLJL*0_*w| zmCeUgn;MGEgB4e6C(BW5Pj{Xj+`L{huiRsAe=D~C$%+j{;BU?Lw`NOfw()W_+w)h? zo<$WKyxy}c#kQsu8+2B#*XHkaLDBU)`kH#p_WeIkuYm+CU#%^Jp>xW{UrVjcM^V{) zyoOryU~#qPYp(J6sncBaG+5ErPlVY(4B@JB?}y!(ugW4-+MW<$1AyvrpCqz=a;My@xK(GNvsuTE( zFiE+>F9Rb;s*lV(gI6I=#-U?eo@8hro+#5ID9W@`Ta=NLRh~1Lb$7`D3fDMkSz?lR zc{E~aO`MJ}%fo+NN}n*ZgR$UHgwBP+;Ik{!I5^kxggbeFB5pw#XmuNVQ&yWi>)PZo z&}t>vF6>Erb&~C`A`NrC79yoVPo#t_(AS?QgHP-*-;6u`V#lC5+@kK7>=dCyDee6kEHN6E^UCyz&K4%GNR%YPngN<%6W1&sX{$xCZFj#jI zXy$-@Hq2CUZ(!*H`}~!uIgNG`F{}TjS%i35@Y4^Gx5btggSi|F;@M+c3l&Q`Axu24Ztx*l^(0{x!K9x+&ZW_m6-l%=e z4QdJ6hgo!ZFbU=g(hc+z41 zYLmXQD*SOb!p>l9D_+Tgf4ZYzhvV}qVLgR9*Ok@1lLp?^Bmd-GmzkrE+!|~ThHs*8 z`!Hk+Rpq8|h4f5Rc4t2P52wS^Q&gC93)D@`xhSctAz5{1B%3b<_X;dB_ZED*^b5o# z*J19j-A}#z;XAdJnkT$h@>Vsr*G>^0?98-npwNiFf9amSjIutDNZD@baOBakU^alx z+{jjXZ%E9|Op{3`Uui<;_V@0Jvp8U0Sqi-Q=xS*%7df}SltuP4QmJKnjF7VkDiLu04=zXC{E!TrFq7tsp*k#qj-L|%Z5>vDU zq_ibq%ew(cbIBCXe0C|;F$7&-AJuuRi#w?k3kTm^Xpc3qVTR)e{~%&B#ETvexQsuN z5gbx!c(Bl5GSkb-XE9PIT^c2u-V+NEJzM0MZe9o?w#)BG1LI`{TJs=gq$l=_gNEW) zk+3X1Bvd7EWCaVQgaul-N?>|5JfM|);}EMKsS>}vVESaSDO z65A?ce9Pl|NhX+jCr;uFtLnundn{LLr^z+-wLCN_6^2aa7L3{d2!E`?1eQoMx6cE<#4}B`Lz;`UcMYYaQ+2$(Fu)JIzmq zV>NCSPdDR>y+^SZd+AO*d_H!crJIxIrH(!0%!i$YSd?GDGATBf^4hcM9kT@6ylbKJalypU;jFpp1mCw zr>|d{bWy2p4Sc78D}mOAWn(_%L#TBbvQ^q5hBm+dBXC$`V{a}VEi&^+FuzjT5q9G! zY9HSfnN)0+-g#ex4Cf%)#K|y^XcB}+TrYcCg5nbvP}!f$RrZ&Z%6>cM3`$rrS{B-`761;?o3r zjWv9~;F~QMQ7o{R_{G!eZE5i6OzF1NFi24_)9i*nF3^y_sJ9cfFw9=`Vu78gK6`tg zc%0TCW?5-Xf9(09s^j`yzc1g(y^n3wU93J_Yn zzgpwj@~LeJVz09ki>=*qC$_k;Y-PXPUM^kGZ^W2}+5W!bChhymG+nl0ovW1TR9rCH zY^)<$xXih~su;<#rS&VzPgtRe>pZBj6->Q4tk9bjm+#cH4kKN$D#TYts)X~ttaI4} zi!I}Bxw(+~{>4Q3-gSE{gA&X0QFkc{2)#%>m{&q~MR$m2ah7^+Fv5ap`p=6nK)alx zU{jD*-I2wmth*FNRa9|R$N#eM%GZVnmR`%qLX$#}sUk`|M<#m(ruCLFH+m$l?=dPp zv>Sn!@AdMe)(B>bzQ3p&gvL=F%wLsIz<@q2u7! z92{%bb#RJ5J?DXH=?+P-LZ$nl8Y{1^MkMV(SU&JY{1d6JT_3_Os`OFJ124FvQtGcr zGAZe=5UlcQ@tiT&c3G5!CE83j3%N6B!hB7C#y*>(U%{cF*|U&GgZnK|hpFl|qI`fk zuG$cb@_2IgsePc+W+~MGWa*%6TdH`ti8;ucI>5Hb8dFHWbr4Cng-)i2U@@CG0>g6E zMDqLu#vCB=Ok2s?w%$>@ee5Ueg0?gwFdiSLLmiQg$+zAaE6QZ=qVMfjb?;djZou>V}pJkA;U5%fwbT$P2ZDKK0@}ynHFoVo56figN;~5r9^;t0u#+bXy=_$ ze;<|l`wiPlR(+hN(hE8+v4Uu4`n!=&LeX>wjHSOQyrw=fnpAiBHI7}GKVhvQfq-6Z z_wp0iBHAKmW4@zfZ}m_2gf)|6L}~pS7E-f)_%gScNnJeaoTLM+6Xeq#2QKK zE;j8=OP#P%viiEL)xA(dch&Hsm2FsVQzF%iTVzud5T!jDHO4IGD9tIR_B02avHx-E zn&UP5UXA9xXmg$|DgwfNHoS7zk)=W8_*1(7fkC!lFWND{eESmTGjCqCDWtkTZIygO z4JQWBcTf5~RUv5LSnEyjoZa$`@!Wl0D$mWW-F6IcHA%dA70;<|oag#m3C|NfU61F? zq>l02eO@ZhP2R+I3~)6`ym=MRscxL-`dbOl6Fpsz=kDM&#&Y|0sT|jd6x%Vl)%38| zRs6=Pady+E5^l%4nVZ>Moky2Mr@c2beXh6cC6BEi-l~VHebugeaxqdL+oKOn{?pw0 z5{1(bcD=9R+9A#H&wO;2Pdg0^($&#g0oj7k;R%N2LHwC}EdU?5&|fe_%KPLk&Z-uM zNHuv0XfXbpLgLyKr5yX>H^3mdb{;8%DD+4%0w^0bi>Oxy|C1#G+4#4xkw!RL3MfZE za4>lLbP?WuOI9t1>Te=!-$YjC8{})EXjM>jnj7UFXMW%u{d?Bm#H@GrgLnD-8eIP? z>jTg0E4lK`CG}ef+R`NCn#e~^%oZ?C*1B_8Cwx;xd&WmK+03Ht4Oi0_NVFibhk?RU&>(34N`_f{|7sZcSJRMU$-FVrzLp*HXBnHDW$JPa4{tYI;hz}`pNZVNW)U3} z*(A%y8-v~&^+w~Gx<}x%pg=U1i9<9dqpAb5;kWm1NCpMq6flX41qC;D?A)tAYV&Z+ z$JX#kc3qP@0WiIKEw=oJ@Fh|P`mzkLW$|^Pb)&HiN|rK{zS*)DiO28_z`yn5Us^vN z9sg;S;nDG;nlIJz>mXjyLwcnCI=b}QT5(BA@dotUB3u5yb>Lq{2Zoxgo(5dVw!BG` z@aT9M{I4Y8Yg(2|VApjJ_}j$!^OzU1-4X-?O#%t^I{wFC!AP9}*YHV}JLIl;K+J^F zJ0M2Ua|gr}8PJKuJ)NhVxm&E^8Z<2RJay*wbQ}Lrhj+BjI*K?Z6(-j{g)sfD@qURh z>r^B(LKq+sagWmot%tz_>opp$L+h_fv%~OayY*dxYc;sB#<+1qqE?6eC1bF3R(6&Q zaoO|+=vI$>hv~VR+UeRO`KLc`{zefS-#%nwp(ut>x}N({OMyYQ3<>(nxcm}_GWD_k z`iEFI#?ggYQ7&a`UqQ-(L$sP_ZP!0Rtk=<&HGpbWB<8qK%X;>;yZ??^^5EJLOQeDi z!Q4PVrhnzWZSu>+BQfnQ3|BJaKjgIw3IvdZ?T(9jv%aASDXxO%(jwOiL+cu%$NRogU-FX1+(is-G9dNBmUYqZHtazrqe zJum%x;cg#{1gv}eV14<9PY_kFJ@T}6I1gjB97tkQVJa4S;hITig`1Ybb>+9 zOr2v#coN|bAGSwNKO0k=FV)FYYY%)fbQDTV+)K?;a8ox9Df%C2&Kh53l25J2Pr#DZh(}=P^-S$Ji2-AIOAI@B}0nRO@b?+mW;ue z98JTEg0LfuOqYyJ37uQ+!(zRD1-_K&?-&D0Nx$9#%D_fadURU8*q-PStEsV#;Z{Zz zXm0$&=_dd)$4m)nJ0T35T>kS`m9 zz^ShXTwt~3f4#oikS7E#O(a#sN1u5ob4jl?0HRu787KmP?lF}4YY|!9OTF0|C-7D< zR;shZRlV%O+%zz8!JZCV#y58z&HUdGip$rw{6Y z`Y;znSfE0>(%=6`cZ>07IF}2vThY>OhY0LdY^=oH^`W@=F{!bu-=V2R-H=U`LlthMq} z;xO3b{@$dcyRP_nIwR(j4s~LM@Q|`n9}KhzPrQDOLaY)S(v1nBNx-ZS7+Xz>i)$?t zt?%?EN*4@^nOQ%E>i?i=#6*yqmLR4D%Ucv27FImy$l786?xIWPAsTLG>4GN$8k1o0#(C!7 zeqbqAPusKh`{X&PcM=Mf^`i`tV^c~T2z4&l_jwjmj#DHCOP_TzEZljgsm+jRijDPR zr?w8A)X8fUn^puFF6nIBeUhEF3(V->mhp!aU>J;mt~;BX#fXu8%ZR_D`*@<*Laz$g z4g~KaNIFG;1!m{BSG*j)c{|%1`@Sj_--Vo&@2Oz+U)DiwT7Jj zH#+v$8hG=7j%t@Z%AikWFXacH#kHAd##50U}(blD5^?&;{@!e8H9vZM1Ksua&OI|+9PYXYxRv!|9UulR{HLd?G@Bu;?&bVA_Iw<> zF}QVc1PogEPXfoCUZFw7aa-lM-3=H>$jQNanUC<{4SLhbKdyb5pN#TLHR&E6HohCH zC4IXw)eV%cJ8Wf#O+0~|Oh&;O>m@r(HH{jVt?V*+IJ`HVE~&ro>UDVV=~V5pro;Xs z-L?GH$JPAZ!CfK=R*x;~Sn32_dT2Mu9<#BjAsTT64x~9mogQACk-LJ2m)X zD7;a+x~eJ3%5s>D-;6#j5xYfEIh=OK#c;NuCQ*I0vOngWRDU#+O#CB_=VaC$?N0|e z?6KxS^<^k92CalZo6n9l;kRG}g*c`Leb}EZOh;7omq5uJ6ug+`OCEt3V#(gS%1~Uo z43x1Zt?;4TJDE6lcD8;Pe6Or-3a?&6+})ox{`as1n0ds+Yo1f3CptAO8^O zU0Sfs1OfVUISIe0ji=ggRde}`u9zaid|!yymkxdzyStb5*iH44?55B2v0FDn8!JhJ zu9ViPYR8oie*RQRf%ErM{@d!`A zcGUjxt(v>T{ukUu=%;7pu5bV3d3V+rllxiWjxVFo!zj`&x>AK#V1quJylFhi`@kEe zzc17dRKaQYx<%f~#^65ah<2LNz9O@agE5-|b@+D(rvJ9fV!p%g8r^W$wSS^E>p%zX zyV7)oF!u_&+pPFQ&w8!gU1^r$fL+;o5|P6RV92{y*o znz0g?7n6_40l`r#BL>k$cSplL=#{8u-n8)v26lu5!$3%afk0))-oATVmS2BJEDni5 z*)96rv;05LC*X~esL~%6HZWQBiVakGn_3d+&nv&*UQs>#zOwQK{`o!9)2nfw?rZ-H z7iRjso$S-V&;&*M**~FY?lx&959k=4NGHhc+4MXozB6aTZM>RtI|7}AP0dsFZwURU ze{9;+^^GYh&8HbWM`g598;io4O2KrolB{iuSqt|W3cEdpX171fYNNduUFU>{)ifgkq@Yg~Cv4ktLFH`N+*_7EDk zvH=uq-_m9d>|~+5P^cBd0$zb?`0oY#>H~YSs+DyEs~>(mVufl1@#L^iUD}cVdFNoa z(L{BHAB?jX2*N-0BfoqpXWEH)ArEbRd^i{;armuhAS3jONldZo{D7(RdJBwMPNECh z6?JtbkX7@Bio;+bCH5wwnN1<wq`$IDwTg zT^^00?dJG6!N|yh9_O4`(t`zjUJf%3jsfVZ|oncxB&Z{OgTePTb`bs znP9a$?ACe!nx;?0G2CA5i9WN5;(FdZ z64I8aX#{j{oWl-rIQyjKGeKs<8!|+M{$nvT2&VC~y(&I~W!O7sGb7P+wBzqPRsto0)M-t0#FEr2uf&F;!LVC2@&8`kq;M&;yiLNr=g zu8Z_=ADBH+o#jOpv%%06wFTk2^UO`^u$8%CaoFPMa8wO`@uhhI5Wf8LZK>mx#}vKA zJ+NEcI?OqkoaRo#0v4$jd4xTx0;v)u5Aq8|(#%HL=3RmH(Hau0iQJ-oku@D;&1}@P zFa-OuOj!VVjIoK1I;oCUMMqT&yn*>TCZ%xeV+an%l!*G8Ml%ssdTQ#e?Un-W^w3o; zG4>CPM-u~Ay7H%@-bz%Dtr}s2=CF^Q9|pHfU1b8k>o^zwnO{b{3Q?B>_b2>w_rG30 z+52Vh@PPCmD7 z-cVg_Wh)*0tE2u}!@t(lU+ehSy83Ga|JqQ0-NV1`slV>yU-#8tKj2?KsJ|ZIUk}t@ zKjL3Ms=vAf89M3FpU_L6{)BD@^e6O_)1T1M3H=E@?KlWOI|z>*geMNdu7mJYLpYX` zODALbs%{l4U3yuYONIhBXMH)UlA);d{5d4&_*?kEoc8)sYv4SOZDe3Pb0Z2*26??2 z5Brk=Xvk=J`{%A!pITMy{qoP(2d`ef-2Y|gaQF4Ed(V~DSM^>@l;MXQzqj_|{bco> z|MIKfU+?^At3TWStsMCM^|jSh?GW}4>l^E~_Rhh<-Y?I0pS*tYZ0Gsz0j*!Xiw7vA zpI7k$pAse|MKGN~6LjwL&|mK0*&FW^kij?~ycl)Id1J_Wmf8Hy;5%mX8)n37GJPn{F>Ji-B=v}OBU}JZJ2Rf>=q5fyv{B!u`?ZNqUI(efo<^awZ zsv1f-rU3B_{u7QLwlM~9*wP~KZ1S;g|G}u+?t>8)y$9`V=Lc#h-<@LIZ@kNf0w1GW zZA#9RVHc7OJ~nCQ&9XpOj3Wd!Dp-fcXzD*tJJ{L$@Ekn zyxM?+-}2E2J`+-^-R$7JSLjO$u%)!c`3Kl!nj@cEToLv#MC}SUN2|agbHGfpiHFNq zbguke-JbDEkss5pfQXZ#1MuR#0R4BlAU&t><_tlw+lMr${KK|?E`3GbW?%q=1zEE5 zpG4J0eyP@xf-~ij;mUkW(Xpd&rUuOB-GWIhyA8f(ye;Y`{77r8tGj!N(gn^&!1ju2 zT^XcRTis5PkC)JNh2zxt8vqLk0UvUd>731MNPxtC;-GG3Wn(A-Dnmzos)bJ#T-CLQ zj2Mat>bQ?NbpfR4R8rtnhgD*ofAGXv?WH^A2&x)uRjd(vw$l!Je7wRnS7@aSU*b4j z3+HPqyE^UQf7h;VvGZXlRq6tY?Y3-A>VX^}+FaR?dpvXd7D+g@&)B$PL|ER{go`h# zK9qAepgBi_ZLw?+fr$5fJ6DPKsuHh6vC*GXr|p3WJ}XoM%nx57q8P;#jJL~JJfAu} zh5fSIil0iGhpzNu9e2TqsTjOBId6}Jyj~P)w=hLeO=Uw@X-}_?gA0gN3Q{11(k3r; z>-Ox!e1Z;_hEH1>jJx}7H5kT+!e6Wr()9Rk-hZDDlFOcISGc$kwOcD)`Mjmifne(j z+{$`7>dw@DiS^-lg~C!qR&}NsB8T7P!P4e{mn*}J&fWQ~0ez6BsF@+20Hm6kM`kGl zU$^nDQ4u(hEVOufRz{$aQ@VL?iS)%!0X!egXgggxKp>&!MLRf$G1aeCSF15 z6+4h~m*T5QZ|b2&`=hct^weY~$zpwRbEQtJ3o`c~X}+lusfj2y6t2YUi5EiMvSWupmj|s;9E@W}>DDb@n5cXnjRC46Y1^EUzNnN#Z&6_?0U=l&Ky0ov zrdEGM)=S%dDJGmiy%M!kxA+~M9=qjl84EePwT%bTkKBQ@UTuxwEV67LmE`z3wSsjj zJ=zO&6{hWHbkyMQ7AINpxB_)k12ybvkkiVJl*39+jJ+Z%7BzOm^@Z6eL|>3=2?@jR zU?G_d3l0YwGcB1uqZ5q*Ny*{1Gn&m~5Yg%L00a-Lo=hw=mED}~+ z(R9qheVcK4e2(q9V99)&cL!)KLulO=`!MScNBRRlVw;~}0Mz7=PgLte4V_~zD$XsA zKuF8N_LT-3Ey_VqfpkiCTiNXTQeD8guIF=x#r6O=QnK8$+z(j)u)O}vuYZ6IbXRvY z460)@H0Z$~CXo$r(9%`;RGLc!bng-4hPzoT;um^~Fz?H@4w^}_-rvdsLBDp-8i60D zm0c7I6Joct-mHu69tv*b)14r|?|ghh4fDaA`vjXV>*_+y>%rvXcs7Y_4Oj;{e`%T% zM?=^c1t1F3(9pfzD_>YS04$@u?a)A> zb9jXI1vwk%vbv*^D-=UQ;5|FrPTBez;X;UgeMhOD+zIQ|X7CMn21&b)5U-NFAfp=Z zp}eJSnqsEdl@~P!w!#7PZ|QyEBRtP?T{PYC!@rF;#vBa%n|WV=fhh@;{e4%bLvaA1 z`Y~r7)>fzj;(K_KxCM?M9S{{NNatg$6m@5kZyAJ{%L<9{T{KV_cn3{KtTDP0{+>rw z^N9N@E|?u$d8_NGo_4(KpkDeT2xJgP>Sj67!B)Ct+t!IMK94*{I?{7hCGl9xoZ=oG z+dfLyxnx&0ot&c6?*rPa&XRZZH~sq{c8~XP^6K#E1E%eQONWZJ=fm;r!S=RHS9I`r zZ;x7wX0E;#6nSZ2$geHyGgSNytG^CER$n@653D*eV%vAXuti@~hZhyG1UqlhMp0^d zxcI}V?G+r|@SbJBr_TKvjOyG^a;kGb$|}|38}h1izl>RqWX>&xag<&2P3ZKcPo76D z9@Qje`nTcituDb}DSI6=Jp)X5U&)ms0JT?`w#-yD_glrn%Ma$e#m_@pTKW_%w6?Kj z3SF!ZMx@~Im`|wV+VQX!{1k+!K;l7c?6y66!QexV{jJ%fE%C~n#n4r>INNp5BM88X zI=as~bm%(U34)^VEXzEHOE@-r1>N4c*d+MLBYinsdlYb1TxjaH>~}Ljd&o%)jsq$n zG;M=_(X5lZ&j?^io(Gi*wkhx}UKPUaL{*5W3%An1g`G0l4f$g+Ps_crXMmVU^AH8p zA|asY@NAk0N5Z0HY&9B|sqhbvwp?s=?Zbgo}Mwq_j`He!nLZo^59U(HS)2mnyP z!@k;4JB;-zz+u8njz|9-wfs3-61`51^8#!*4dD7~W(^MY?eY_lZ0fhN9w+a7cCx;P zcP0D=<(oIbEQ68>Tjm267tE|1%CBb)s8?Sj9Mzpr&;fu zZUqc~#k4sYPK()ZlPUUH-MJ5%J?`5>x)^Xz*goR({d@P;@0DVo;`e;muL%W8WAj}d zCMoWBj+=F8hfjr?=;ML=*3sX{RttE8W|_|7fF>F4(;SS4?lyyD(BFa3f6hSYn)K+< zK3|J%gBC+5b>%W}sXBR;s%;xon+G~IvlNK61n9LeCeOHLmmjswxPuepBCby^tRCSg z2N)0|VOljV0wRLi#2Z(;f;Ht| z8eZ;N)fMkEThLZpTV3zm@7x!+!0x$4H0 z_&{3t^+KyhrR6%P<{AnK__5lwT8yzs$k*ph^3cD{r}-B&{K~~I)c2RrER{px>4Sq1~S>c+Cxgi z=&z#YemnmNwRH*GLP4Fd_zrnIW z>oqGMk`pnbu-5h|!3n$BXO7NKj!!>6*x;M|dkJoJeq2*qf=^}MN?TQtcU8{b7Hd+2 z)m+5qW3^(h<8{OZA2Tp(?fMpC_QvY^8fP}E^oIkXmT2_5bk-8SWy5H&AFou)+GCO! zK4DzUIeIPEy2e0y+GoD8tZ|?avj*#Khi`c?m3n&q_(SJjXX_gb^*KA%`0@Vz)d%7* zVvSXFryHFI>-Sc5%?G;XdP;gW;7H-T^Z-H%MdMtYKY&MXqnVb#h*%{AP@1rdOJIvZ z`iq}{-~>7Ktg6${!#1yPyaew0VsM#qt~#;VnCHYs>WU>C+7O(ZJ+$%dnsRe7aU5VK zLh5V=zjNEB@@!=>DY=Oglv3NL+&G?#TT*|?!;??$qysDbBU_K1VqCH#7F{nmIB9%x zN4fJKaCPpj&V9tir`vJ{NLoJ?7E}55V`)Pq){ax*@AxAaz0SSJ=zXd&dTx|mf01ex zCsU0-@N8=h54x@+4;%AKgQp~yBM{PlTHwsn-(-Fbv5+>zsda-f3yI6j53xhdwNPd@ z(3skY)czx^Tq2020_Nn9QL%s^p3^DogQhmt-1+N#A{riY0BnjP34`1sJmk3frFmMq7*0{)7H{&|k0W>Ow5nl_i?v zQ=@b9B+0SMC4q2 zp67#yyW0&=SVMa2n;sv|r_;%FGuwq}V$vAypU?V})BGj=RIS7Y$3oych8IdZt@!r; z)9!Gz(!dVvOc``%U8F|)+3y@~E1JNgt5g!*G6!X}2@fPwmpq$0KvYuNkjY3~{IdTd z&5P;etP6R~b;F0Rwj1tl$t&}6kX-{EBn~?Y+Qu9!RDCcmve|%fi3@!=zvQ$1X=9L| zbdmLk7M^K(+MV^^!s2J%sq90Ze`1xIldB2|*g>g1zNx7GCdsOFv(FD2P` zx3i~@6^>6I3*4w8m<5G_=uZ#L`a3UM*_~aOB9@ahJzl~RF1QBVs6AzL>0Gm>F|`u$ z3M3+UK1cxddO~8`B}`=V>18mVi1r1i)JqGpLN+vq3o-bjie>m5GmE5wshyX#1T~5b zor*Q9Q6eEOpGS?kCr=b7fBwV~qB&G={%9e42|_l<6bgVE@qM0u+y&^rA@p4U2}Mob z6V_RLTx@AQPCzN)qdulofEgQ_|G;KFgkp4q0+!nl@0If`z9d5O+I~h_8(O~Pc zMN^Z@XPOImuCp&K*tyKthh~W~M5K&Yp~J-Eec{TVn51U8wo`RQ&()O$C+o^wOEX`V z{V7{v0z?*OdV1>r0Z>Z;0u%!j000080J26bSoVkjt*8J101g2F01W^D0000000000 z0HlEc0001OVQy(=Wpi{cbZ>2JP)h*<6ay3h000O8vPLXem9lo;1Kj`s4toUv2LJ#7 u0000000000q=C}_003}uZ)b90ZBR=E1^@s600IC40B`^R0Q=nl0000HUt|mb diff --git a/Source/DafnyStandardLibraries/src/Std/Collections/Array.dfy b/Source/DafnyStandardLibraries/src/Std/Collections/Array.dfy index 8175eb78dd..0995bf6e15 100644 --- a/Source/DafnyStandardLibraries/src/Std/Collections/Array.dfy +++ b/Source/DafnyStandardLibraries/src/Std/Collections/Array.dfy @@ -12,7 +12,7 @@ module Std.Collections.Array { import opened Relations import opened Seq - method BinarySearch(a: array, key: T, less: (T, T) -> bool) returns (r: Option) + method BinarySearch(a: array, key: T, less: (T, T) -> bool) returns (r: Option) requires SortedBy((x, y) => less(x, y) || x == y, a[..]) requires StrictTotalOrdering(less) ensures r.Some? ==> r.value < a.Length && a[r.value] == key diff --git a/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy b/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy index 65358c44dc..1d8deec010 100644 --- a/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy +++ b/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy @@ -186,7 +186,7 @@ module Std.Collections.Seq { /* Is true if there are no duplicate values in the sequence. */ ghost predicate {:opaque} HasNoDuplicates(xs: seq) { - (forall i, j {:trigger xs[i], xs[j]}:: 0 <= i < |xs| && 0 <= j < |xs| && i != j ==> xs[i] != xs[j]) + forall i, j :: 0 <= i < |xs| && 0 <= j < |xs| && i != j ==> xs[i] != xs[j] } /* If sequences xs and ys don't have duplicates and there are no @@ -201,12 +201,9 @@ module Std.Collections.Seq { reveal HasNoDuplicates(); var zs := xs + ys; if |zs| > 1 { - assert forall i {:trigger zs[i]} :: 0 <= i < |xs| ==> - zs[i] in multiset(xs); - assert forall j {:trigger zs[j]} :: |xs| <= j < |zs| ==> - zs[j] in multiset(ys); - assert forall i, j {:trigger zs[i], zs[j]} :: i != j && 0 <= i < |xs| && |xs| <= j < |zs| ==> - zs[i] != zs[j]; + assert forall i :: 0 <= i < |xs| ==> zs[i] in multiset(xs); + assert forall j :: |xs| <= j < |zs| ==> zs[j] in multiset(ys); + assert forall i, j :: 0 <= i < |xs| <= j < |zs| ==> zs[i] != zs[j]; } } @@ -271,7 +268,7 @@ module Std.Collections.Seq { function {:opaque} IndexOf(xs: seq, v: T): (i: nat) requires v in xs ensures i < |xs| && xs[i] == v - ensures forall j {:trigger xs[j]} :: 0 <= j < i ==> xs[j] != v + ensures forall j :: 0 <= j < i ==> xs[j] != v { if xs[0] == v then 0 else 1 + IndexOf(xs[1..], v) } @@ -280,7 +277,7 @@ module Std.Collections.Seq { the index of its first occurrence. Otherwise the return is None. */ function {:opaque} IndexOfOption(xs: seq, v: T): (o: Option) ensures if o.Some? then o.value < |xs| && xs[o.value] == v && - forall j {:trigger xs[j]} :: 0 <= j < o.value ==> xs[j] != v + forall j :: 0 <= j < o.value ==> xs[j] != v else v !in xs { IndexByOption(xs, x => x == v) @@ -290,7 +287,7 @@ module Std.Collections.Seq { the index of the first such occurrence. Otherwise the return is None. */ function {:opaque} IndexByOption(xs: seq, p: T -> bool): (o: Option) ensures if o.Some? then o.value < |xs| && p(xs[o.value]) && - forall j {:trigger xs[j]} :: 0 <= j < o.value ==> !p(xs[j]) + forall j :: 0 <= j < o.value ==> !p(xs[j]) else forall x <- xs ::!p(x) { if |xs| == 0 then None() @@ -306,7 +303,7 @@ module Std.Collections.Seq { function {:opaque} LastIndexOf(xs: seq, v: T): (i: nat) requires v in xs ensures i < |xs| && xs[i] == v - ensures forall j {:trigger xs[j]} :: i < j < |xs| ==> xs[j] != v + ensures forall j :: i < j < |xs| ==> xs[j] != v { if xs[|xs|-1] == v then |xs| - 1 else LastIndexOf(xs[..|xs|-1], v) } @@ -315,7 +312,7 @@ module Std.Collections.Seq { the index of its last occurrence. Otherwise the return is None. */ function {:opaque} LastIndexOfOption(xs: seq, v: T): (o: Option) ensures if o.Some? then o.value < |xs| && xs[o.value] == v && - forall j {:trigger xs[j]} :: o.value < j < |xs| ==> xs[j] != v + forall j :: o.value < j < |xs| ==> xs[j] != v else v !in xs { LastIndexByOption(xs, x => x == v) @@ -383,7 +380,7 @@ module Std.Collections.Seq { /* Returns a constant sequence of a given length. */ function {:opaque} Repeat(v: T, length: nat): (xs: seq) ensures |xs| == length - ensures forall i: nat {:trigger xs[i]} | i < |xs| :: xs[i] == v + ensures forall i: nat | i < |xs| :: xs[i] == v { if length == 0 then [] @@ -392,7 +389,7 @@ module Std.Collections.Seq { } /* Unzips a sequence that contains pairs into two separate sequences. */ - function {:opaque} Unzip(xs: seq<(A, B)>): (seq, seq) + function {:opaque} Unzip(xs: seq<(A, B)>): (seq, seq) ensures |Unzip(xs).0| == |Unzip(xs).1| == |xs| ensures forall i {:trigger Unzip(xs).0[i]} {:trigger Unzip(xs).1[i]} :: 0 <= i < |xs| ==> (Unzip(xs).0[i], Unzip(xs).1[i]) == xs[i] @@ -404,10 +401,10 @@ module Std.Collections.Seq { } /* Zips two sequences of equal length into one sequence that consists of pairs. */ - function {:opaque} Zip(xs: seq, ys: seq): seq<(A, B)> + function {:opaque} Zip(xs: seq, ys: seq): seq<(A, B)> requires |xs| == |ys| ensures |Zip(xs, ys)| == |xs| - ensures forall i {:trigger Zip(xs, ys)[i]}:: 0 <= i < |Zip(xs, ys)| ==> Zip(xs, ys)[i] == (xs[i], ys[i]) + ensures forall i {:trigger Zip(xs, ys)[i]} :: 0 <= i < |Zip(xs, ys)| ==> Zip(xs, ys)[i] == (xs[i], ys[i]) ensures Unzip(Zip(xs, ys)).0 == xs ensures Unzip(Zip(xs, ys)).1 == ys { @@ -416,7 +413,7 @@ module Std.Collections.Seq { } /* Unzipping and zipping a sequence results in the original sequence */ - lemma LemmaZipOfUnzip(xs: seq<(A,B)>) + lemma LemmaZipOfUnzip(xs: seq<(A, B)>) ensures Zip(Unzip(xs).0, Unzip(xs).1) == xs { } @@ -440,7 +437,7 @@ module Std.Collections.Seq { /* Returns the maximum integer value in a non-empty sequence of integers. */ function {:opaque} Max(xs: seq): int requires 0 < |xs| - ensures forall k {:trigger k in xs} :: k in xs ==> Max(xs) >= k + ensures forall k :: k in xs ==> Max(xs) >= k ensures Max(xs) in xs { assert xs == [xs[0]] + xs[1..]; @@ -466,7 +463,7 @@ module Std.Collections.Seq { /* Returns the minimum integer value in a non-empty sequence of integers. */ function {:opaque} Min(xs: seq): int requires 0 < |xs| - ensures forall k {:trigger k in xs} :: k in xs ==> Min(xs) <= k + ensures forall k :: k in xs ==> Min(xs) <= k ensures Min(xs) in xs { assert xs == [xs[0]] + xs[1..]; @@ -479,7 +476,7 @@ module Std.Collections.Seq { requires 0 < |xs| && 0 < |ys| ensures Min(xs+ys) <= Min(xs) ensures Min(xs+ys) <= Min(ys) - ensures forall i {:trigger i in xs + ys} :: i in xs + ys ==> Min(xs + ys) <= i + ensures forall i :: i in xs + ys ==> Min(xs + ys) <= i { reveal Min(); if |xs| == 1 { @@ -614,7 +611,7 @@ module Std.Collections.Seq { to the length of xs multiplied by a number not smaller than the length of the longest sequence in xs. */ lemma LemmaFlattenLengthLeMul(xs: seq>, j: int) - requires forall i {:trigger xs[i]} | 0 <= i < |xs| :: |xs[i]| <= j + requires forall i | 0 <= i < |xs| :: |xs[i]| <= j ensures |FlattenReverse(xs)| <= |xs| * j { if |xs| == 0 { @@ -717,11 +714,11 @@ module Std.Collections.Seq { /* Returns the sequence one obtains by applying a function to every element of a sequence. */ - function {:opaque} Map(f: (T ~> R), xs: seq): (result: seq) - requires forall i {:trigger xs[i]} :: 0 <= i < |xs| ==> f.requires(xs[i]) + function {:opaque} Map(f: (T ~> R), xs: seq): (result: seq) + requires forall i :: 0 <= i < |xs| ==> f.requires(xs[i]) ensures |result| == |xs| - ensures forall i {:trigger result[i]}:: 0 <= i < |xs| ==> result[i] == f(xs[i]) - reads set i, o {:trigger o in f.reads(xs[i])} | 0 <= i < |xs| && o in f.reads(xs[i]):: o + ensures forall i {:trigger result[i]} :: 0 <= i < |xs| ==> result[i] == f(xs[i]) + reads set i, o | 0 <= i < |xs| && o in f.reads(xs[i]) :: o { if |xs| == 0 then [] else [f(xs[0])] + Map(f, xs[1..]) @@ -730,7 +727,7 @@ module Std.Collections.Seq { /* Applies a function to every element of a sequence, returning a Result value (which is a failure-compatible type). Returns either a failure, or, if successful at every element, the transformed sequence. */ - function {:opaque} MapWithResult(f: (T ~> Result), xs: seq): (result: Result, E>) + function {:opaque} MapWithResult(f: (T ~> Result), xs: seq): (result: Result, E>) requires forall i :: 0 <= i < |xs| ==> f.requires(xs[i]) ensures result.Success? ==> && |result.value| == |xs| @@ -749,9 +746,9 @@ module Std.Collections.Seq { /* Applying a function to a sequence is distributive over concatenation. That is, concatenating two sequences and then applying Map is the same as applying Map to each sequence separately, and then concatenating the two resulting sequences. */ - lemma {:opaque} {:resource_limit 1000000000} LemmaMapDistributesOverConcat(f: (T ~> R), xs: seq, ys: seq) - requires forall i {:trigger xs[i]}:: 0 <= i < |xs| ==> f.requires(xs[i]) - requires forall j {:trigger ys[j]}:: 0 <= j < |ys| ==> f.requires(ys[j]) + lemma {:resource_limit 1000000000} LemmaMapDistributesOverConcat(f: (T ~> R), xs: seq, ys: seq) + requires forall i :: 0 <= i < |xs| ==> f.requires(xs[i]) + requires forall j :: 0 <= j < |ys| ==> f.requires(ys[j]) ensures Map(f, xs + ys) == Map(f, xs) + Map(f, ys) { reveal Map(); @@ -774,7 +771,7 @@ module Std.Collections.Seq { function {:opaque} Filter(f: (T ~> bool), xs: seq): (result: seq) requires forall i :: 0 <= i < |xs| ==> f.requires(xs[i]) ensures |result| <= |xs| - ensures forall i: nat {:trigger result[i]} :: i < |result| && f.requires(result[i]) ==> f(result[i]) + ensures forall i: nat :: i < |result| && f.requires(result[i]) ==> f(result[i]) reads set i, o | 0 <= i < |xs| && o in f.reads(xs[i]) :: o { if |xs| == 0 then [] @@ -784,7 +781,7 @@ module Std.Collections.Seq { /* Filtering a sequence is distributive over concatenation. That is, concatenating two sequences and then using "Filter" is the same as using "Filter" on each sequence separately, and then concatenating the two resulting sequences. */ - lemma {:opaque} {:vcs_split_on_every_assert} + lemma {:vcs_split_on_every_assert} LemmaFilterDistributesOverConcat(f: (T ~> bool), xs: seq, ys: seq) requires forall i {:trigger xs[i]}:: 0 <= i < |xs| ==> f.requires(xs[i]) requires forall j {:trigger ys[j]}:: 0 <= j < |ys| ==> f.requires(ys[j]) @@ -807,7 +804,7 @@ module Std.Collections.Seq { /* Folds a sequence xs from the left (the beginning), by repeatedly acting on the accumulator init via the function f. */ - function {:opaque} FoldLeft(f: (A, T) -> A, init: A, xs: seq): A + function {:opaque} FoldLeft(f: (A, T) -> A, init: A, xs: seq): A { if |xs| == 0 then init else FoldLeft(f, f(init, xs[0]), xs[1..]) @@ -816,7 +813,7 @@ module Std.Collections.Seq { /* Folding to the left is distributive over concatenation. That is, concatenating two sequences and then folding them to the left, is the same as folding to the left the first sequence and using the result to fold to the left the second sequence. */ - lemma {:opaque} LemmaFoldLeftDistributesOverConcat(f: (A, T) -> A, init: A, xs: seq, ys: seq) + lemma LemmaFoldLeftDistributesOverConcat(f: (A, T) -> A, init: A, xs: seq, ys: seq) ensures FoldLeft(f, init, xs + ys) == FoldLeft(f, FoldLeft(f, init, xs), ys) { reveal FoldLeft(); @@ -839,19 +836,19 @@ module Std.Collections.Seq { /* Is true, if inv is an invariant under stp, which is a relational version of the function f passed to fold. */ - ghost predicate InvFoldLeft(inv: (B, seq) -> bool, - stp: (B, A, B) -> bool) + ghost predicate InvFoldLeft(inv: (B, seq) -> bool, + stp: (B, A, B) -> bool) { forall x: A, xs: seq, b: B, b': B :: inv(b, [x] + xs) && stp(b, x, b') ==> inv(b', xs) } /* inv(b, xs) ==> inv(FoldLeft(f, b, xs), []). */ - lemma LemmaInvFoldLeft(inv: (B, seq) -> bool, - stp: (B, A, B) -> bool, - f: (B, A) -> B, - b: B, - xs: seq) + lemma LemmaInvFoldLeft(inv: (B, seq) -> bool, + stp: (B, A, B) -> bool, + f: (B, A) -> B, + b: B, + xs: seq) requires InvFoldLeft(inv, stp) requires forall b, a :: stp(b, a, f(b, a)) requires inv(b, xs) @@ -867,7 +864,7 @@ module Std.Collections.Seq { /* Folds a sequence xs from the right (the end), by acting on the accumulator init via the function f. */ - function {:opaque} FoldRight(f: (T, A) -> A, xs: seq, init: A): A + function {:opaque} FoldRight(f: (T, A) -> A, xs: seq, init: A): A { if |xs| == 0 then init else f(xs[0], FoldRight(f, xs[1..], init)) @@ -876,7 +873,7 @@ module Std.Collections.Seq { /* Folding to the right is (contravariantly) distributive over concatenation. That is, concatenating two sequences and then folding them to the right, is the same as folding to the right the second sequence and using the result to fold to the right the first sequence. */ - lemma {:opaque} LemmaFoldRightDistributesOverConcat(f: (T, A) -> A, init: A, xs: seq, ys: seq) + lemma LemmaFoldRightDistributesOverConcat(f: (T, A) -> A, init: A, xs: seq, ys: seq) ensures FoldRight(f, xs + ys, init) == FoldRight(f, xs, FoldRight(f, ys, init)) { reveal FoldRight(); @@ -896,19 +893,19 @@ module Std.Collections.Seq { /* Is true, if inv is an invariant under stp, which is a relational version of the function f passed to fold. */ - ghost predicate InvFoldRight(inv: (seq, B) -> bool, - stp: (A, B, B) -> bool) + ghost predicate InvFoldRight(inv: (seq, B) -> bool, + stp: (A, B, B) -> bool) { forall x: A, xs: seq, b: B, b': B :: inv(xs, b) && stp(x, b, b') ==> inv(([x] + xs), b') } /* inv([], b) ==> inv(xs, FoldRight(f, xs, b)) */ - lemma LemmaInvFoldRight(inv: (seq, B) -> bool, - stp: (A, B, B) -> bool, - f: (A, B) -> B, - b: B, - xs: seq) + lemma LemmaInvFoldRight(inv: (seq, B) -> bool, + stp: (A, B, B) -> bool, + f: (A, B) -> B, + b: B, + xs: seq) requires InvFoldRight(inv, stp) requires forall a, b :: stp(a, b, f(a, b)) requires inv([], b) @@ -951,7 +948,7 @@ module Std.Collections.Seq { } /* Proves that any two sequences that are sorted by a total order and that have the same elements are equal. */ - lemma SortedUnique(xs: seq, ys: seq, R: (T, T) -> bool) + lemma SortedUnique(xs: seq, ys: seq, R: (T, T) -> bool) requires SortedBy(R, xs) requires SortedBy(R, ys) requires TotalOrdering(R) @@ -973,7 +970,7 @@ module Std.Collections.Seq { } /* Converts a set to a sequence that is ordered w.r.t. a given total order (ghost). */ - ghost function SetToSortedSeqSpec(s: set, R: (T, T) -> bool): (xs: seq) + ghost function SetToSortedSeqSpec(s: set, R: (T, T) -> bool): (xs: seq) requires TotalOrdering(R) ensures multiset(s) == multiset(xs) ensures SortedBy(R, xs) @@ -982,7 +979,7 @@ module Std.Collections.Seq { } /* Converts a set to a sequence that is ordered w.r.t. a given total order (compiled). */ - method SetToSortedSeq(s: set, R: (T, T) -> bool) returns (xs: seq) + method SetToSortedSeq(s: set, R: (T, T) -> bool) returns (xs: seq) requires TotalOrdering(R) ensures multiset(s) == multiset(xs) ensures SortedBy(R, xs) @@ -998,7 +995,7 @@ module Std.Collections.Seq { ***************************** */ //Splits a sequence in two, sorts the two subsequences (recursively), and merges the two sorted sequences using `MergeSortedWith` - function MergeSortBy(lessThanOrEq: (T, T) -> bool, a: seq): (result :seq) + function MergeSortBy(lessThanOrEq: (T, T) -> bool, a: seq): (result :seq) requires TotalOrdering(lessThanOrEq) ensures multiset(a) == multiset(result) ensures SortedBy(lessThanOrEq, result) @@ -1018,7 +1015,7 @@ module Std.Collections.Seq { } // Helper function for MergeSortBy - function {:tailrecursion} MergeSortedWith(left: seq, right: seq, lessThanOrEq: (T, T) -> bool) : (result :seq) + function {:tailrecursion} MergeSortedWith(left: seq, right: seq, lessThanOrEq: (T, T) -> bool) : (result :seq) requires SortedBy(lessThanOrEq, left) requires SortedBy(lessThanOrEq, right) requires TotalOrdering(lessThanOrEq) @@ -1042,7 +1039,7 @@ module Std.Collections.Seq { [right[0]] + MergeSortedWith(left, right[1..], lessThanOrEq) } - lemma LemmaNewFirstElementStillSortedBy(newFirst: T, s: seq, lessOrEqual: (T, T) -> bool) + lemma LemmaNewFirstElementStillSortedBy(newFirst: T, s: seq, lessOrEqual: (T, T) -> bool) requires SortedBy(lessOrEqual, s) requires |s| == 0 || lessOrEqual(newFirst, s[0]) requires TotalOrdering(lessOrEqual) diff --git a/Source/DafnyStandardLibraries/src/Std/JSON/Utils/Views.dfy b/Source/DafnyStandardLibraries/src/Std/JSON/Utils/Views.dfy index e165f56bf6..bef9530e2e 100644 --- a/Source/DafnyStandardLibraries/src/Std/JSON/Utils/Views.dfy +++ b/Source/DafnyStandardLibraries/src/Std/JSON/Utils/Views.dfy @@ -124,4 +124,4 @@ module Std.JSON.Utils.Views.Core { { lv.(end := rv.end) } -} \ No newline at end of file +} diff --git a/Source/DafnyStandardLibraries/src/Std/Relations.dfy b/Source/DafnyStandardLibraries/src/Std/Relations.dfy index 5cda42cc02..7340bf4783 100644 --- a/Source/DafnyStandardLibraries/src/Std/Relations.dfy +++ b/Source/DafnyStandardLibraries/src/Std/Relations.dfy @@ -33,11 +33,11 @@ module Std.Relations { forall x, y :: relation(x, y) ==> !relation(y, x) } - lemma AsymmetricIsAntiSymmetric(relation: (T, T) -> bool) + lemma AsymmetricIsAntiSymmetric(relation: (T, T) -> bool) ensures Asymmetric(relation) ==> AntiSymmetric(relation) {} - lemma AsymmetricIsIrreflexive(relation: (T, T) -> bool) + lemma AsymmetricIsIrreflexive(relation: (T, T) -> bool) ensures Asymmetric(relation) ==> Irreflexive(relation) {} @@ -103,4 +103,4 @@ module Std.Relations { ghost predicate SortedBy(lessOrEqual: (T, T) -> bool, xs: seq) { forall i, j | 0 <= i < j < |xs| :: lessOrEqual(xs[i], xs[j]) } -} \ No newline at end of file +} diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/TypeParameters.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/TypeParameters.dfy index 3b845bf8b6..6a514e50e8 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/TypeParameters.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/TypeParameters.dfy @@ -252,7 +252,7 @@ ghost method ListLemma_T(xs: List, ys: List) { assert Subset(xs, ys); } -ghost method ammeLtsiL_T(xs: List, ys: List) +ghost method ammeLtsiL_T(xs: List, ys: List) requires Subset(xs, ys) { assert forall x :: InList(x, xs) ==> InList(x, ys); diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ACL2-extractor.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ACL2-extractor.dfy index f99f10f5f2..1fbcd25964 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ACL2-extractor.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ACL2-extractor.dfy @@ -85,7 +85,7 @@ lemma ExtractorTheorem(xs: List) // lemmas about length -lemma XtrLength(mp: List, lst: List) +lemma XtrLength(mp: List, lst: List) ensures length(xtr(mp, lst)) == length(mp); { } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ExpandedGuardedness.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ExpandedGuardedness.dfy index 17dfd08319..c2d37d1cfa 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ExpandedGuardedness.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/ExpandedGuardedness.dfy @@ -144,7 +144,7 @@ greatest predicate TotalLang(l: Lang) forall s: S :: l.deriv.requires(s) && l.deriv.reads(s) == {} && TotalLang(l.deriv(s)) } -greatest lemma NothingTotal() +greatest lemma NothingTotal() ensures TotalLang(Nothing()) { } @@ -162,7 +162,7 @@ greatest predicate TotalLang_Nat[nat](l: Lang) forall s: S :: l.deriv.requires(s) && l.deriv.reads(s) == {} && TotalLang_Nat(l.deriv(s)) } -greatest lemma NothingTotal_Nat[nat]() +greatest lemma NothingTotal_Nat[nat]() ensures TotalLang_Nat(Nothing()) { } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy new file mode 100644 index 0000000000..fa67020eaf --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy @@ -0,0 +1,95 @@ + // RUN: %testDafnyForEachResolver --expect-exit-code=2 "%s" + +module Basics { + function F(): int + function G(): int + function H(): int + function J(): int + + type Cmp + + class Cell { } + type Nonempty = x: int | x % 2 == 0 ghost witness 4 + datatype Record = Record(x: int, ghost y: int) // note, no equality support + + method Test() + ensures F() == 9 // error: type argument is required to support (!new) + ensures G() == 9 // error: type argument is required to support (0) + ensures H() == 9 // error: type argument is required to support (00) + ensures J() == 9 + { + var x0 := F(); // error: type argument is required to support (!new) + var x1 := G(); // error: type argument is required to support (0) + var x2 := H(); + var x3 := J(); // error: type argument is required to support (==) + ghost var y0 := F(); // error: type argument is required to support (!new) + ghost var y1 := G(); + ghost var y2 := H(); + ghost var y3 := J(); + } + + method MethodSpecification(o: object) + requires F() < 100 // error: type argument is required to support (!new) + modifies if F() < 20 then {o} else {} // error: type argument is required to support (!new) + ensures F() < 100 // error: type argument is required to support (!new) + decreases F() // error: type argument is required to support (!new) + + function FunctionSpecification(o: object): int + requires F() < 100 // error: type argument is required to support (!new) + reads if F() < 20 then {o} else {} // error: type argument is required to support (!new) + ensures F() < 100 // error: type argument is required to support (!new) + decreases F() // error: type argument is required to support (!new) + + iterator IteratorSpecification(o: object) + requires F() < 100 // error: type argument is required to support (!new) + yield requires F() < 80 // error: type argument is required to support (!new) + modifies if F() < 20 then {o} else {} // error: type argument is required to support (!new) + reads if F() < 20 then {o} else {} // error: type argument is required to support (!new) + yield ensures F() < 80 // error: type argument is required to support (!new) + ensures F() < 100 // error: type argument is required to support (!new) + decreases F() // error: type argument is required to support (!new) + + method DefaultParameters0(x: int := J()) // error: type argument is required to support (==) + method DefaultParameters1(ghost y: int := J()) + + datatype DefaultValues = + | Ctor0(x: int := J()) // error: type argument is required to support (==) + | Ctor1(ghost y: int := J()) + | ghost Ctor2(z: int := J()) + + function FunctionWithNamedResult(): (u: Cmp) // error: type argument is required to support (==) + function FunctionWithUnnamedResult(): Cmp // error: type argument is required to support (==) +} + +module Extreme { + codatatype InfiniteTree = Node(value: int, next: A -> InfiniteTree) + + greatest predicate Bisimilar(t: InfiniteTree, u: InfiniteTree) { + && t.value == u.value + && forall a: A :: Bisimilar(t.next(a), u.next(a)) + } + + greatest lemma SelfSimilar(t: InfiniteTree) + ensures Bisimilar(t, t) // error: type argument is required to support (!new) + { + } + + greatest lemma SelfSimilarCorrected(t: InfiniteTree) + ensures Bisimilar(t, t) + { + } + + class Class { } + + lemma SelfSimilarForClass(t: InfiniteTree) + ensures Bisimilar(t, t) // error: type argument is required to support (!new) + { + SelfSimilarCorrected(t); // error: type argument is required to support (!new) + } + + lemma SelfSimilarForClassHash(o: ORDINAL, t: InfiniteTree) + ensures Bisimilar#[o](t, t) // error: type argument is required to support (!new) + { + SelfSimilarCorrected#[o](t); // error: type argument is required to support (!new) + } +} diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy.expect new file mode 100644 index 0000000000..0add3357e1 --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4926.dfy.expect @@ -0,0 +1,39 @@ +git-issue-4926.dfy(16,12): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(17,12): Error: type parameter (A) passed to function G must support auto-initialization (got Cell) +git-issue-4926.dfy(18,12): Error: type parameter (A) passed to function H must support nonempty (got Cell) +git-issue-4926.dfy(21,14): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(22,14): Error: type parameter (A) passed to function G must support auto-initialization (got Nonempty) +git-issue-4926.dfy(24,14): Error: type parameter (A) passed to function J must support equality (got Record) +git-issue-4926.dfy(25,20): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(32,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(33,16): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(34,12): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(35,14): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(38,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(39,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(40,12): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(41,14): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(52,38): Error: type parameter (A) passed to function J must support equality (got Record) +git-issue-4926.dfy(60,42): Error: type parameter (A) passed to type Cmp must support equality (got Record) +git-issue-4926.dfy(61,40): Error: type parameter (A) passed to type Cmp must support equality (got Record) +git-issue-4926.dfy(44,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(46,16): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(49,12): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(50,14): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(45,19): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(47,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(48,18): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(44,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(47,13): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(46,16): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(50,14): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(45,19): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(48,18): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(49,12): Error: type parameter (A) passed to function F must support no references (got Cell) +git-issue-4926.dfy(56,22): Error: type parameter (A) passed to function J must support equality (got Record) +git-issue-4926.dfy(73,12): Error: type parameter (A) passed to greatest predicate Bisimilar must support no references (got A) (perhaps try declaring type parameter 'A' on line 72 as 'A(!new)', which says it can only be instantiated with a type that contains no references) +git-issue-4926.dfy(85,12): Error: type parameter (A) passed to greatest predicate Bisimilar must support no references (got Class) +git-issue-4926.dfy(87,31): Error: type parameter (A) passed to greatest lemma SelfSimilarCorrected must support no references (got Class) +git-issue-4926.dfy(91,12): Error: type parameter (A) passed to prefix predicate Bisimilar# must support no references (got Class) +git-issue-4926.dfy(93,35): Error: type parameter (A) passed to prefix lemma SelfSimilarCorrected# must support no references (got Class) +38 resolution/type errors detected in git-issue-4926.dfy diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Folding.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Folding.dfy index 2b73098e99..da885b8e29 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Folding.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Folding.dfy @@ -48,10 +48,10 @@ function foldr(f: (A,B) -> B, b: B, xs: List): B ghost predicate InvR(inv: (List,B) -> bool, stp: (A,B,B) -> bool) { forall x, xs, b, b' :: - inv(xs, b) && stp(x, b, b') ==> inv(Cons(x, xs), b') + inv(xs, b) && stp(x, b, b') ==> inv(Cons(x, xs), b') } -lemma FoldR_Property(inv: (List,B) -> bool, stp: (A,B,B) -> bool, f: (A,B) -> B, b: B, xs: List) +lemma FoldR_Property(inv: (List,B) -> bool, stp: (A,B,B) -> bool, f: (A,B) -> B, b: B, xs: List) requires InvR(inv, stp) requires forall a,b :: stp(a, b, f(a,b)) requires inv(Nil, b) @@ -74,7 +74,7 @@ lemma FoldR_Property(inv: (List,B) -> bool, stp: (A,B,B) -> bool, f: (A, } } -lemma FoldR_Property_ShortProof(inv: (List,B) -> bool, stp: (A,B,B) -> bool, f: (A,B) -> B, b: B, xs: List) +lemma FoldR_Property_ShortProof(inv: (List,B) -> bool, stp: (A,B,B) -> bool, f: (A,B) -> B, b: B, xs: List) requires InvR(inv, stp) requires forall a,b :: stp(a, b, f(a,b)) requires inv(Nil, b) @@ -153,14 +153,14 @@ function foldl(f: (B,A) -> B, b: B, xs: List): B ghost predicate InvL(inv: (B,List) -> bool, stp: (B,A,B) -> bool) { forall x, xs, b, b' :: - inv(b, Cons(x, xs)) && stp(b, x, b') ==> inv(b', xs) + inv(b, Cons(x, xs)) && stp(b, x, b') ==> inv(b', xs) } // This is the analogous lemma to FoldR_Property above. But instead of proving // inv(Nil, b) ==> inv(xs, foldr(f, b, xs)) // this lemma proves // inv(b, xs) ==> inv(foldl(f, b, xs), Nil) -lemma FoldL_Property(inv: (B,List) -> bool, stp: (B,A,B) -> bool, f: (B,A) -> B, b: B, xs: List) +lemma FoldL_Property(inv: (B,List) -> bool, stp: (B,A,B) -> bool, f: (B,A) -> B, b: B, xs: List) requires InvL(inv, stp) requires forall b,a :: stp(b, a, f(b, a)) requires inv(b, xs) diff --git a/docs/dev/news/4928.fix b/docs/dev/news/4928.fix new file mode 100644 index 0000000000..4f1d3d2b04 --- /dev/null +++ b/docs/dev/news/4928.fix @@ -0,0 +1 @@ +Check for correct usage of type characteristics in specifications and other places where they were missing