From 42da98a13213ca59f1c306c2e33b603ebead258f Mon Sep 17 00:00:00 2001
From: Peter <43498358+Petersmit27@users.noreply.github.com>
Date: Wed, 1 Nov 2023 09:24:46 +0100
Subject: [PATCH] init commit again
---
IBAF-Editor/.gitignore | 11 +
IBAF-Editor/.mvn/extensions.xml | 8 +
IBAF-Editor/.mvn/jvm.config | 1 +
IBAF-Editor/.mvn/maven.config | 1 +
IBAF-Editor/.mvn/settings.xml | 69 ++
IBAF-Editor/README.md | 2 +
IBAF-Editor/editor/Analysis.esv | 10 +
IBAF-Editor/editor/Main.esv | 15 +
IBAF-Editor/editor/Menus.esv | 7 +
IBAF-Editor/editor/Refactoring.esv | 7 +
IBAF-Editor/editor/Syntax.esv | 27 +
IBAF-Editor/lib/StrategoMix.def | 937 ++++++++++++++++++
IBAF-Editor/metaborg.yaml | 42 +
IBAF-Editor/pom.xml | 64 ++
.../strategies/InteropRegisterer.java | 10 +
.../IBAF_Editor/strategies/Main.java | 9 +
IBAF-Editor/syntax/Funcons-pp.sdf3 | 9 +
IBAF-Editor/syntax/Funcons.sdf3 | 87 ++
IBAF-Editor/syntax/IBAF.sdf3 | 12 +
IBAF-Editor/syntax/Stratego-IBAF.sdf | 11 +
IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3 | 72 ++
IBAF-Editor/trans/analysis.str | 34 +
IBAF-Editor/trans/cbs-gen/IBAF-Start.meta | 1 +
IBAF-Editor/trans/cbs-gen/IBAF-Start.str | 53 +
IBAF-Editor/trans/generate.meta | 1 +
IBAF-Editor/trans/generate.str | 118 +++
IBAF-Editor/trans/ibaf.str | 21 +
IBAF-Editor/trans/outline.str | 18 +
IBAF-Editor/trans/pp.str | 52 +
IBAF-Editor/trans/statics.nabl2 | 12 +
IBAF-cbs/.project | 17 +
IBAF-cbs/Funcons-beta | 1 +
IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs | 47 +
.../org.example_CBS_0.1.0-SNAPSHOT/constraint | Bin 0 -> 50932491 bytes
34 files changed, 1786 insertions(+)
create mode 100644 IBAF-Editor/.gitignore
create mode 100644 IBAF-Editor/.mvn/extensions.xml
create mode 100644 IBAF-Editor/.mvn/jvm.config
create mode 100644 IBAF-Editor/.mvn/maven.config
create mode 100644 IBAF-Editor/.mvn/settings.xml
create mode 100644 IBAF-Editor/README.md
create mode 100644 IBAF-Editor/editor/Analysis.esv
create mode 100644 IBAF-Editor/editor/Main.esv
create mode 100644 IBAF-Editor/editor/Menus.esv
create mode 100644 IBAF-Editor/editor/Refactoring.esv
create mode 100644 IBAF-Editor/editor/Syntax.esv
create mode 100644 IBAF-Editor/lib/StrategoMix.def
create mode 100644 IBAF-Editor/metaborg.yaml
create mode 100644 IBAF-Editor/pom.xml
create mode 100644 IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/InteropRegisterer.java
create mode 100644 IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/Main.java
create mode 100644 IBAF-Editor/syntax/Funcons-pp.sdf3
create mode 100644 IBAF-Editor/syntax/Funcons.sdf3
create mode 100644 IBAF-Editor/syntax/IBAF.sdf3
create mode 100644 IBAF-Editor/syntax/Stratego-IBAF.sdf
create mode 100644 IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3
create mode 100644 IBAF-Editor/trans/analysis.str
create mode 100644 IBAF-Editor/trans/cbs-gen/IBAF-Start.meta
create mode 100644 IBAF-Editor/trans/cbs-gen/IBAF-Start.str
create mode 100644 IBAF-Editor/trans/generate.meta
create mode 100644 IBAF-Editor/trans/generate.str
create mode 100644 IBAF-Editor/trans/ibaf.str
create mode 100644 IBAF-Editor/trans/outline.str
create mode 100644 IBAF-Editor/trans/pp.str
create mode 100644 IBAF-Editor/trans/statics.nabl2
create mode 100644 IBAF-cbs/.project
create mode 120000 IBAF-cbs/Funcons-beta
create mode 100644 IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs
create mode 100644 IBAF-cbs/target/analysis/org.example_CBS_0.1.0-SNAPSHOT/constraint
diff --git a/IBAF-Editor/.gitignore b/IBAF-Editor/.gitignore
new file mode 100644
index 0000000..d0d8774
--- /dev/null
+++ b/IBAF-Editor/.gitignore
@@ -0,0 +1,11 @@
+/.cache
+/bin
+/src-gen
+/target
+
+/.classpath
+/.project
+/.settings
+/.factorypath
+
+/.polyglot.metaborg.yaml
diff --git a/IBAF-Editor/.mvn/extensions.xml b/IBAF-Editor/.mvn/extensions.xml
new file mode 100644
index 0000000..eadd583
--- /dev/null
+++ b/IBAF-Editor/.mvn/extensions.xml
@@ -0,0 +1,8 @@
+
+
+
+ org.metaborg
+ spoofax-maven-plugin-pomless
+ 2.5.18
+
+
diff --git a/IBAF-Editor/.mvn/jvm.config b/IBAF-Editor/.mvn/jvm.config
new file mode 100644
index 0000000..67bd169
--- /dev/null
+++ b/IBAF-Editor/.mvn/jvm.config
@@ -0,0 +1 @@
+-Xmx512m
diff --git a/IBAF-Editor/.mvn/maven.config b/IBAF-Editor/.mvn/maven.config
new file mode 100644
index 0000000..6998b70
--- /dev/null
+++ b/IBAF-Editor/.mvn/maven.config
@@ -0,0 +1 @@
+--global-settings .mvn/settings.xml
diff --git a/IBAF-Editor/.mvn/settings.xml b/IBAF-Editor/.mvn/settings.xml
new file mode 100644
index 0000000..9a31c2a
--- /dev/null
+++ b/IBAF-Editor/.mvn/settings.xml
@@ -0,0 +1,69 @@
+
+
+
+
+ add-metaborg-release-repos
+
+
+ metaborg-release-repo
+ https://artifacts.metaborg.org/content/repositories/releases/
+
+ true
+
+
+ false
+
+
+
+
+
+ metaborg-release-repo
+ https://artifacts.metaborg.org/content/repositories/releases/
+
+ true
+
+
+ false
+
+
+
+
+
+
+ add-metaborg-snapshot-repos
+
+
+ metaborg-snapshot-repo
+ https://artifacts.metaborg.org/content/repositories/snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+ metaborg-snapshot-repo
+ https://artifacts.metaborg.org/content/repositories/snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+ add-metaborg-release-repos
+ add-metaborg-snapshot-repos
+
+
diff --git a/IBAF-Editor/README.md b/IBAF-Editor/README.md
new file mode 100644
index 0000000..35c25a6
--- /dev/null
+++ b/IBAF-Editor/README.md
@@ -0,0 +1,2 @@
+# IBAF Language Specification
+
diff --git a/IBAF-Editor/editor/Analysis.esv b/IBAF-Editor/editor/Analysis.esv
new file mode 100644
index 0000000..4bd2bbe
--- /dev/null
+++ b/IBAF-Editor/editor/Analysis.esv
@@ -0,0 +1,10 @@
+module Analysis
+
+imports
+
+ nabl2/Menus
+ nabl2/References
+
+language
+
+ observer : editor-analyze (constraint)
diff --git a/IBAF-Editor/editor/Main.esv b/IBAF-Editor/editor/Main.esv
new file mode 100644
index 0000000..657306d
--- /dev/null
+++ b/IBAF-Editor/editor/Main.esv
@@ -0,0 +1,15 @@
+module Main
+
+imports
+ Menus
+ Syntax
+ Analysis
+ Refactoring
+
+language
+
+ extensions : iba
+
+// Add this provider when switching Stratego to interpreted mode:
+// provider : target/metaborg/stratego.ctree
+ provider : target/metaborg/stratego.jar
diff --git a/IBAF-Editor/editor/Menus.esv b/IBAF-Editor/editor/Menus.esv
new file mode 100644
index 0000000..de3d3f2
--- /dev/null
+++ b/IBAF-Editor/editor/Menus.esv
@@ -0,0 +1,7 @@
+module Menus
+
+menus
+
+ menu: "Generation" (openeditor) (realtime)
+
+ action: "Generate Funcons" = generate-fct
diff --git a/IBAF-Editor/editor/Refactoring.esv b/IBAF-Editor/editor/Refactoring.esv
new file mode 100644
index 0000000..1018718
--- /dev/null
+++ b/IBAF-Editor/editor/Refactoring.esv
@@ -0,0 +1,7 @@
+module Refactoring
+
+menus
+
+ menu: "Refactoring"
+
+ action: "Rename" = rename-menu-action
\ No newline at end of file
diff --git a/IBAF-Editor/editor/Syntax.esv b/IBAF-Editor/editor/Syntax.esv
new file mode 100644
index 0000000..629f9ee
--- /dev/null
+++ b/IBAF-Editor/editor/Syntax.esv
@@ -0,0 +1,27 @@
+module Syntax
+
+imports
+
+ libspoofax/color/default
+ completion/colorer/IBAF-cc-esv
+
+language
+
+ table : target/metaborg/sdf.tbl
+ start symbols : Start
+
+ line comment : "//"
+ block comment : "/*" * "*/"
+ fences : [ ] ( ) { }
+
+menus
+
+ menu: "Syntax" (openeditor)
+
+ action: "Format" = editor-format (source)
+ action: "Show parsed AST" = debug-show-aterm (source)
+
+views
+
+ outline view: editor-outline (source)
+ expand to level: 3
diff --git a/IBAF-Editor/lib/StrategoMix.def b/IBAF-Editor/lib/StrategoMix.def
new file mode 100644
index 0000000..f96d1c8
--- /dev/null
+++ b/IBAF-Editor/lib/StrategoMix.def
@@ -0,0 +1,937 @@
+definition
+module Stratego-Sugar-Overlays
+imports
+ Stratego-Core-Identifiers
+ Stratego-Sugar-Terms
+
+exports
+ sorts Overlay
+ context-free syntax
+ Id "=" Term -> Overlay {cons("OverlayNoArgs")}
+ Id "(" {Id ","}* ")" "=" Term -> Overlay {cons("Overlay")}
+
+module Stratego-Sugar-DynamicRules
+imports
+ Stratego-Core-Identifiers
+ Stratego-Sugar-Strategies
+ Stratego-Sugar-Rules
+
+exports
+
+ sorts ScopeLabels
+ context-free syntax
+
+ "{|" ScopeLabels ":" Strategy "|}" -> Strategy {cons("DynRuleScope")}
+
+ {DynRuleScopeId ","}* -> ScopeLabels
+ "~" Term -> ScopeLabels {cons("ScopeLabels")}
+
+ sorts DynRuleDef DynRuleId DynRuleScopeId RuleDec
+ context-free syntax
+
+ "rules" "(" DynRuleDef* ")" -> Strategy {cons("GenDynRules")}
+
+ Id "+" Term -> DynRuleDef {cons("AddScopeLabel")}
+ DynRuleId ":-" Term -> DynRuleDef {cons("UndefineDynRule")}
+ DynRuleId ":" Rule -> DynRuleDef {cons("SetDynRule")}
+ DynRuleId ":+" Rule -> DynRuleDef {cons("AddDynRule")}
+ DynRuleId ":" Term -> DynRuleDef {cons("SetDynRuleMatch")}
+
+ DynRuleId ":=" Term -> DynRuleDef {cons("DynRuleAssign")}
+ DynRuleId ":+=" Term -> DynRuleDef {cons("DynRuleAssignAdd")}
+
+ DynRuleId ":" Rule "depends" "on" Term -> DynRuleDef {cons("SetDynRuleDepends")}
+
+ RuleDec "." Term -> DynRuleId {cons("LabeledDynRuleId")}
+ RuleDec "+" Term -> DynRuleId {cons("AddLabelDynRuleId")}
+ RuleDec -> DynRuleId {cons("DynRuleId")}
+
+ Id "." Term -> DynRuleScopeId {cons("LabeledDynRuleScopeId")}
+ Id -> DynRuleScopeId {cons("DynRuleScopeId")}
+
+ context-free syntax
+
+ Id -> RuleDec {cons("RDecNoArgs")}
+ Id "(" {Typedid ","}* ")" -> RuleDec {cons("RDec")}
+ Id "(" {Typedid ","}*
+ "|" {Typedid ","}* ")" -> RuleDec {cons("RDecT")}
+
+ sorts RuleNames
+ context-free syntax
+ {Id ","}* -> RuleNames
+ "~" Term -> RuleNames {cons("RuleNames")}
+
+ "/" RuleNames "\\*" Strategy -> Strategy {cons("DynRuleIntersectFix")}
+
+ syntax
+ %% no space after RuleNames
+ "\\" "/*"
+ -> {cons("DynRuleUnionFix")}
+
+ %% 1 space after RuleNames
+ "\\" " /*"
+ -> {cons("DynRuleUnionFix")}
+
+ %% no space after RuleNames
+ "/" "\\"
+ "/*"
+ -> {cons("DynRuleIntersectUnionFix")}
+
+ %% 1 space after RuleNames
+ "/" "\\"
+ " /*"
+ -> {cons("DynRuleIntersectUnionFix")}
+
+
+ context-free syntax
+ Strategy "/" RuleNames"\\" Strategy -> Strategy {cons("DynRuleIntersect"),right}
+ Strategy "\\" RuleNames "/" Strategy -> Strategy {cons("DynRuleUnion"),right}
+
+ Strategy "/" RuleNames "\\"
+ RuleNames "/" Strategy -> Strategy {cons("DynRuleIntersectUnion"),right}
+
+ priorities
+ -> {cons("BA")}
+ > {
+
+ %% no space after RuleNames
+ "\\" "/*"
+ -> {cons("DynRuleUnionFix")}
+
+ %% 1 space after RuleNames
+ "\\" " /*"
+ -> {cons("DynRuleUnionFix")}
+
+ %% no space after RuleNames
+ "/" "\\"
+ "/*"
+ -> {cons("DynRuleIntersectUnionFix")}
+
+ %% 1 space after RuleNames
+ "/" "\\"
+ " /*"
+ -> {cons("DynRuleIntersectUnionFix")}
+
+ }
+ > "=>" -> {cons("AM")}
+
+ context-free priorities
+ StrategyAngle Term -> Strategy {cons("BA")}
+ > "/" RuleNames "\\*" Strategy -> Strategy {cons("DynRuleIntersectFix")}
+ > Strategy "=>" Term -> Strategy {cons("AM")}
+ > Strategy "/" RuleNames "\\" Strategy -> Strategy {cons("DynRuleIntersect"),right}
+ > Strategy "\\" RuleNames "/" Strategy -> Strategy {cons("DynRuleUnion"),right}
+ > Strategy "/" RuleNames "\\"
+ RuleNames "/" Strategy -> Strategy {cons("DynRuleIntersectUnion"),right}
+ > Strategy ";" Strategy -> Strategy {cons("Seq"),right}
+
+module Stratego-Sugar-Rules
+imports Stratego-Sugar-Strategies
+exports
+
+ sorts RuleDef
+ context-free syntax
+ Id ":" Rule -> RuleDef {cons("RDefNoArgs")}
+
+ Anno+ RuleDef -> Def {cons("AnnoDef")}
+
+ Id "(" {Typedid ","}* ")" ":" Rule -> RuleDef {cons("RDef")}
+
+ Id "(" {Typedid ","}*
+ "|" {Typedid ","}* ")" ":" Rule -> RuleDef {cons("RDefT")}
+
+ %% Rule definition with pattern matched term parameters
+ Id "(" {Typedid ","}*
+ "|" {Term ","}* ")" ":" Rule -> RuleDef {cons("RDefP"), avoid}
+
+ sorts Rule RuleCond
+ context-free syntax
+ Term "->" Term -> Rule {cons("RuleNoCond")} %% backward comp.
+ Term "->" Term "where" Strategy -> Rule {cons("Rule")} %% backward comp.
+ Term "->" Term RuleCond+ -> Rule {cons("Rule"), avoid}
+
+ "where" Strategy -> RuleCond {cons("WhereClause")}
+ "with" Strategy -> RuleCond {cons("WithClause")}
+
+module Stratego-Sugar-Strategies
+imports
+ Stratego-Core-Strategies
+ Stratego-Sugar-Terms
+ Stratego-Sugar-Constants
+ Stratego-Sugar-Signatures
+
+exports
+ context-free syntax
+ Id "=" Strategy -> StrategyDef {cons("SDefNoArgs")}
+ Id "(" {Typedid ","}* ")" "=" Strategy -> StrategyDef {cons("SDef")}
+
+ %% Strategy definition with pattern matched term parameters
+ Id "(" {Typedid ","}* "|" {Term ","}* ")" "=" Strategy -> StrategyDef {cons("SDefP"), avoid}
+
+ context-free syntax
+ ID -> Typedid {cons("DefaultVarDec")}
+
+ sorts Rule
+
+ sorts StrategyParen StrategyCurly StrategyAngle
+ context-free syntax
+
+ %% Abstraction
+
+ SVar "(" {Strategy ","}* ")" -> Strategy {cons("Call")}
+
+ %% Match and build
+
+ "{" Strategy "}" -> Strategy {cons("ScopeDefault")}
+
+ %%"<" Strategy ">" Term -> Strategy {cons("BA")}
+ StrategyAngle Term -> Strategy {cons("BA")}
+ "<" Strategy ">" -> StrategyAngle {bracket} %% {cons("AngleStrat")}
+
+ %% Combinators
+
+ Strategy "<+" Strategy -> Strategy {cons("LChoice"),right}
+
+ "rec" Id "(" Strategy ")" -> Strategy {cons("Rec")}
+
+ "not" "(" Strategy ")" -> Strategy {cons("Not")}
+ "where" "(" Strategy ")" -> Strategy {cons("Where")}
+ "with" "(" Strategy ")" -> Strategy {cons("With"), prefer}
+ "test" "(" Strategy ")" -> Strategy {cons("Test")}
+
+ %% Primitives
+
+ "prim" "(" String ")" -> Strategy {cons("PrimNoArgs")}
+ "prim" "(" String "," {Term ","}* ")" -> Strategy {cons("Prim")}
+
+ %% Congruence operators
+
+ String -> Strategy {cons("StrCong")}
+ Int -> Strategy {cons("IntCong")}
+ Real -> Strategy {cons("RealCong")}
+ Char -> Strategy {cons("CharCong")}
+
+ String "(" {Strategy ","}* ")" -> Strategy {cons("CongQ")}
+
+ %%"(" {Strategy ","}* ")" -> Strategy {cons("TupleCong"),avoid}
+
+ Strategy StrategyCurly -> Strategy {cons("AnnoCong")}
+
+ "{" Strategy "}" -> StrategyCurly {cons("StrategyCurly")}
+
+ "(" ")" -> Strategy {cons("EmptyTupleCong")}
+ "(" Strategy ")" -> Strategy {bracket}
+ "(" Strategy "," {Strategy ","}+ ")" -> Strategy {cons("TupleCong")}
+
+%% Mod -> Strategy {cons("ModCongNoArgs")}
+%% Mod "(" {Strategy ","}* ")" -> Strategy {cons("ModCong")}
+%% Id "^" Id -> Mod {cons("Mod")}
+ "[" {Strategy ","}* "]" -> Strategy {cons("ListCongNoTail")}
+ "[" {Strategy ","}* "|" Strategy "]" -> Strategy {cons("ListCong")}
+
+%% Strategy "#" "(" StrategyInj ")" -> Strategy {cons("ExplodeCong")}
+%% Strategy "#" "(" Strategy ")" -> Strategy {cons("ExplodeCong")}
+ Strategy "#" StrategyParen -> Strategy {cons("ExplodeCong")}
+
+ %% Syntactic sugar sugar
+
+ sorts SwitchCase
+ context-free syntax
+
+ SVar -> Strategy {cons("CallNoArgs")}
+ "\\" Rule "\\" -> Strategy {cons("LRule")}
+ "(" Rule ")" -> Strategy {cons("SRule")}
+ Strategy "+" Strategy -> Strategy {cons("Choice"),right}
+ Strategy "+>" Strategy -> Strategy {cons("RChoice"),right}
+
+ "proceed" "(" {Strategy "," }+ ")" -> Strategy {cons("Proceed"), prefer}
+
+ "if" Strategy "then" Strategy
+ "else" Strategy "end" -> Strategy {cons("CondChoice")}
+ "if" Strategy "then" Strategy "end" -> Strategy {cons("IfThen")}
+
+ "switch" Strategy SwitchCase* "end" -> Strategy {cons("SwitchChoiceNoOtherwise")}
+ "switch" Strategy SwitchCase*
+ "otherwise" ":" Strategy "end" -> Strategy {cons("SwitchChoice")}
+
+ "case" Strategy ":" Strategy -> SwitchCase {cons("SwitchCase")}
+
+ Strategy "=>" Term -> Strategy {cons("AM")}
+
+ Term ":=" Term -> Strategy {cons("Assign")}
+
+ %% Priorities
+
+ context-free priorities
+ { Strategy StrategyCurly -> Strategy
+ Strategy "#" StrategyParen -> Strategy
+ }
+ > { "!" Term -> Strategy
+ "?" Term -> Strategy
+ }
+ > StrategyAngle Term -> Strategy
+ > Strategy "=>" Term -> Strategy
+ > Strategy ";" Strategy -> Strategy
+ > {right:
+ Strategy "+" Strategy -> Strategy
+ Strategy "<+" Strategy -> Strategy
+ Strategy "+>" Strategy -> Strategy
+
+ Strategy "<" StrategyMid
+ "+" Strategy -> Strategy
+ }
+
+ context-free priorities
+ Strategy -> StrategyMid
+ > Strategy "+" Strategy -> Strategy
+
+ context-free priorities
+ { Strategy StrategyCurly -> Strategy
+ Strategy "#" StrategyParen -> Strategy
+ }
+ .> Term ":=" Term -> Strategy
+
+
+module Stratego-Sugar-Terms
+imports
+ Stratego-Core-Terms
+ Stratego-Sugar-Strategies
+
+exports
+ sorts LID
+ context-free syntax
+ LId -> LID {cons("ListVar")}
+ LID -> Var {cons("Var")}
+ LID -> ID
+
+ context-free syntax
+ "_" PreTerm -> PreTerm {cons("BuildDefaultPT")}
+ "_" Term -> Term {cons("BuildDefault"),prefer}
+
+ Char -> PreTerm {cons("Char")}
+
+ PreTerm "{" {Term ","}* "}" -> Term {cons("AnnoList")}
+ PreTerm -> Term {cons("NoAnnoList")}
+
+ "<" Strategy ">" Term -> PreTerm {cons("App")}
+ "<" Strategy ">" Term -> Term {cons("App"),prefer}
+
+ StrategyAngle -> PreTerm {cons("RootApp")}
+ StrategyAngle -> Term {cons("RootApp"),prefer}
+
+ "(" {Term ","}* ")" -> PreTerm {cons("Tuple")}
+ "[" {Term ","}* "]" -> PreTerm {cons("List")}
+ "[" {Term ","}* "|" Term "]" -> PreTerm {cons("ListTail")}
+
+ context-free priorities
+ Term "#" "(" Term ")" -> PreTerm {cons("Explode")}
+ > PreTerm "{" {Term ","}* "}" -> Term {cons("AnnoList")}
+ > Var "@" Term -> Term {cons("As")}
+
+module Stratego-Sugar-Signatures
+imports
+ Stratego-Core-Signatures
+ Stratego-Sugar-Constants
+
+exports
+
+ sorts Sort
+ context-free syntax
+ "[" {Sort ","}* "]" -> Sort {cons("SortList")}
+ "[" {Sort ","}* "|" Sort "]" -> Sort {cons("SortListTl")}
+ "(" {Sort ","}* ")" -> Sort {cons("SortTuple")}
+
+ sorts Kind
+ context-free syntax
+ "*" -> Kind {cons("Star")}
+ "**" -> Kind {cons("StarStar")}
+
+module Stratego-Core-Signatures
+imports
+ Stratego-Core-Identifiers
+ Stratego-Core-Constants
+exports
+ sorts Sdecl
+ context-free syntax
+ "sorts" Sort* -> Sdecl {cons("Sorts")}
+ "constructors" Opdecl* -> Sdecl {cons("Constructors")}
+
+ sorts Sort
+ context-free syntax
+ LCID -> Sort {cons("SortVar")}
+ UCID -> Sort {cons("SortNoArgs")}
+ Id "(" {Sort ","}* ")" -> Sort {cons("Sort")}
+
+ sorts Opdecl
+ context-free syntax
+ Id ":" Type -> Opdecl {cons("OpDecl")}
+ String ":" Type -> Opdecl {cons("OpDeclQ")}
+ ":" Type -> Opdecl {cons("OpDeclInj")}
+
+ context-free syntax
+ "external" Id ":" Type -> Opdecl {cons("ExtOpDecl")}
+ "external" String ":" Type -> Opdecl {cons("ExtOpDeclQ")}
+ "external" ":" Type -> Opdecl {cons("ExtOpDeclInj")}
+
+ sorts Type ArgType ConstType FunType RetType
+ context-free syntax
+ Sort -> ConstType {cons("ConstType")}
+ {ArgType "*"}+ "->" RetType -> FunType {cons("FunType")}
+ "(" Type ")" -> ArgType {bracket}
+ ConstType -> ArgType
+ Type -> RetType
+ FunType -> RetType {reject}
+
+ FunType -> Type
+ ConstType -> Type
+
+ %%%
+ %% Restriction is required for the Sort* in Sdecl: List(a) is
+ %% ambiguous.
+ %%%
+ context-free restrictions
+ Sort -/- [\(]
+
+module Stratego-Core-Terms
+imports
+ Stratego-Core-Identifiers
+ Stratego-Core-Constants
+
+exports
+ sorts ID Var Wld
+ context-free syntax
+ Id -> Var {cons("Var")}
+ Id -> ID
+ %% ":" Var -> Var {cons("SeqVar")}
+
+ sorts Term PreTerm
+ context-free syntax
+ Var -> PreTerm
+ Var -> Term {prefer}
+
+ "_" -> Wld {cons("Wld")}
+ Wld -> PreTerm
+ Wld -> Term {prefer}
+
+ Int -> PreTerm {cons("Int")}
+ Real -> PreTerm {cons("Real")}
+ String -> PreTerm {cons("Str")}
+
+ Id "(" {Term ","}* ")" -> PreTerm {cons("Op")}
+ String "(" {Term ","}* ")" -> PreTerm {cons("OpQ")}
+ Term "#" "(" Term ")" -> PreTerm {cons("Explode")}
+
+ PreTerm "{^" PreTerm "}" -> Term {cons("Anno")}
+
+ Var "@" Term -> Term {cons("As"),prefer}
+ Var "@" PreTerm -> PreTerm {cons("As")}
+
+ context-free priorities
+ Term "#" "(" Term ")" -> PreTerm {cons("Explode")}
+ > Var "@" Term -> Term {cons("As")}
+
+module Stratego-Core-Strategies
+imports
+ Stratego-Core-Terms
+ Stratego-Core-Constants
+ Stratego-Core-Signatures
+
+exports
+ sorts Def
+ context-free syntax
+ StrategyDef -> Def
+ Id -> SVar {cons("SVar")}
+ "let" Def* "in" Strategy "end" -> Strategy {cons("Let")}
+ SVar "(" {Strategy ","}* "|" {Term ","}* ")" -> Strategy {cons("CallT")}
+
+ "call" "(" Term "|" {Strategy ","}* "|" {Term ","}* ")" -> Strategy {cons("CallDynamic")}
+
+
+ sorts StrategyDef
+ context-free syntax
+ Id "(" {Typedid ","}*
+ "|" {Typedid ","}* ")" "=" Strategy -> StrategyDef {cons("SDefT")}
+
+ Anno+ StrategyDef -> Def {cons("AnnoDef")}
+
+ "external"
+ Id "(" {Typedid ","}*
+ "|" {Typedid ","}* ")" "=" Strategy -> StrategyDef {cons("ExtSDefInl")}
+
+ "external"
+ Id "(" {Typedid ","}*
+ "|" {Typedid ","}* ")" -> StrategyDef {cons("ExtSDef")}
+
+ "external"
+ EmptyId "(" {Typedid ","}*
+ "|" {Typedid ","}* ")" -> StrategyDef {cons("ExtSDef")}
+
+
+ sorts EmptyId
+ lexical syntax
+
+ -> EmptyId
+
+ sorts Anno
+ context-free syntax
+ "extend" -> Anno {cons("Extend")}
+ "override" -> Anno {cons("Override")}
+ "internal" -> Anno {cons("Internal")}
+%% "sealed" -> Anno {cons("Sealed")}
+%% "extensible" -> Anno {cons("Extensible")}
+%% "overridable" -> Anno {cons("Overridable")}
+
+ lexical syntax
+
+ "extend" -> Keyword
+ "override" -> Keyword
+ "internal" -> Keyword
+ "sealed" -> Keyword
+ "extensible" -> Keyword
+ "overridable" -> Keyword
+
+ lexical restrictions
+
+ "extend"
+ "override"
+ "internal"
+ "sealed"
+ "extensible"
+ "overridable" -/- [a-zA-Z0-9\'\-\_]
+
+ sorts Typedid
+ context-free syntax
+ ID ":" Type -> Typedid {cons("VarDec")}
+
+
+ sorts Strategy SVar StrategyParen StrategyMid
+ context-free syntax
+ "(" Strategy ")" -> StrategyParen {cons("ParenStrat")}
+
+ "fail" -> Strategy {cons("Fail")}
+ "id" -> Strategy {cons("Id")}
+
+ "proceed" "(" {Strategy ","}* "|" {Term ","}* ")" -> Strategy {cons("ProceedT"), prefer}
+ "proceed" -> Strategy {cons("ProceedNoArgs"), prefer}
+
+ %% Match and build
+
+ "?" Term -> Strategy {cons("Match")}
+ "!" Term -> Strategy {cons("Build")}
+ "{" {ID ","}* ":" Strategy "}" -> Strategy {cons("Scope")}
+
+ %% Combinators
+
+ Strategy ";" Strategy -> Strategy {cons("Seq"),right}
+ Strategy "<" StrategyMid
+ "+" Strategy -> Strategy {cons("GuardedLChoice"),right}
+ Strategy -> StrategyMid
+
+ %% Primitives
+
+ "prim" "(" String "," {Strategy ","}* "|" {Term ","}*")" -> Strategy {cons("PrimT")}
+
+ %% Traversal
+
+ "some" "(" Strategy ")" -> Strategy {cons("Some")}
+ "one" "(" Strategy ")" -> Strategy {cons("One")}
+ "all" "(" Strategy ")" -> Strategy {cons("All")}
+
+ %% Priorities
+
+ context-free priorities
+ { "!" Term -> Strategy {cons("Build")}
+ "?" Term -> Strategy {cons("Match")}
+ }
+ > Strategy ";" Strategy -> Strategy {cons("Seq"),right}
+ > {right:
+ Strategy "<" StrategyMid
+ "+" Strategy -> Strategy {cons("GuardedLChoice"),right}
+ }
+
+ context-free syntax
+ "import-term" "(" ModName ")" -> Strategy {cons("ImportTerm")}
+
+module Stratego-Core-Modules
+imports
+ Stratego-Core-Identifiers
+ Stratego-Core-Strategies
+ Stratego-Core-Signatures
+
+exports
+ sorts Module
+ context-free syntax
+ "module" ModName Decl* -> Module {cons("Module")}
+ "specification" Decl* -> Module {cons("Specification")}
+
+ sorts Decl
+ context-free syntax
+ "imports" ImportModName* -> Decl {cons("Imports")}
+ "strategies" Def* -> Decl {cons("Strategies")}
+ "signature" Sdecl* -> Decl {cons("Signature")}
+
+ sorts ImportModName
+ context-free syntax
+ ModName -> ImportModName {cons("Import")}
+ syntax
+ "/" "-" -> {cons("ImportWildcard")}
+
+module Stratego-Sugar-Modules
+imports
+ Stratego-Core-Modules
+ Stratego-Sugar-Strategies
+ Stratego-Sugar-Signatures
+ Stratego-Sugar-Overlays
+ Stratego-Sugar-Rules
+
+exports
+
+ sorts Decl Def
+ context-free syntax
+ "rules" Def* -> Decl {cons("Rules")}
+ "overlays" Overlay* -> Decl {cons("Overlays")}
+
+ RuleDef -> Def
+
+
+module Stratego-Sugar-StringQuotations
+exports
+
+ sorts
+ StringQuotation
+ StringQuotedPart1 StringQuotedChars1 DollarOpen1 DollarClose1 QuotedBracket1 Dollar1
+ StringQuotedPart2 StringQuotedChars2 DollarOpen2 DollarClose2 QuotedBracket2 Dollar2
+ StringQuotedPart3 StringQuotedChars3 DollarOpen3 DollarClose3 QuotedBracket3 Dollar3
+ StringQuotedPart4 StringQuotedChars4 DollarOpen4 DollarClose4 QuotedBracket4 Dollar4
+ Padding
+
+ context-free syntax
+
+ StringQuotation -> PreTerm
+
+ syntax
+
+ StringQuotation ->
+
+ "$" "[" Padding StringQuotedPart1* "]" -> StringQuotation {cons("StringQuotation1") }
+ Padding "[" "]" -> StringQuotedPart1 {cons("StringEscape1")}
+ -> StringQuotedPart1 {cons("QStr")}
+ -> StringQuotedPart1 {cons("QDollar")}
+ "$" "$" -> StringQuotedPart1 {cons("QBr")}
+ ~[\[\]\$]+ ->
+ [\[\]] ->
+ "$" ->
+
+ "$" "{" Padding StringQuotedPart2* "}" -> StringQuotation {cons("StringQuotation2") }
+ Padding "{" "}" -> StringQuotedPart2 {cons("StringEscape2")}
+ -> StringQuotedPart2 {cons("QStr")}
+ -> StringQuotedPart2 {cons("QDollar")}
+ "$" "$" -> StringQuotedPart2 {cons("QBr")}
+ ~[\{\}\$]+ ->
+ [\{\}] ->
+ "$" ->
+
+ "$" "(" Padding StringQuotedPart3* ")" -> StringQuotation {cons("StringQuotation3") }
+ Padding "(" ")" -> StringQuotedPart3 {cons("StringEscape3")}
+ -> StringQuotedPart3 {cons("QStr")}
+ -> StringQuotedPart3 {cons("QDollar")}
+ "$" "$" -> StringQuotedPart3 {cons("QBr")}
+ ~[\(\)\$]+ ->
+ [\(\)] ->
+ "$" ->
+
+ "$" "<" Padding StringQuotedPart4* ">" -> StringQuotation {cons("StringQuotation4") }
+ Padding "<" ">" -> StringQuotedPart4 {cons("StringEscape4")}
+ -> StringQuotedPart4 {cons("QStr")}
+ -> StringQuotedPart4 {cons("QDollar")}
+ "$" "$" -> StringQuotedPart4 {cons("QBr")}
+ ~[\<\>\$]+ ->
+ [\<\>] ->
+ "$" ->
+
+ %% Padding is a dummy lexical that will contain the indentation prefix of every quotation
+ -> Padding
+ -> {indentpadding}
+
+ lexical restrictions
+
+ StringQuotedChars1 -/- ~[\[\]\$]
+ StringQuotedChars2 -/- ~[\{\}\$]
+ StringQuotedChars3 -/- ~[\(\)\$]
+ StringQuotedChars4 -/- ~[\<\>\$]
+ Dollar1 -/- [\[\]] . [\$]
+ Dollar2 -/- [\{\}] . [\$]
+ Dollar3 -/- [\(\)] . [\$]
+ Dollar4 -/- [\<\>] . [\$]
+
+module Stratego-Core-Constants
+exports
+ sorts Int Real String StrChar
+ lexical syntax
+ [\-]? [0-9]+ -> Int
+ [\-]? [0-9]+ [\.] [0-9]+ -> Real
+ "\"" StrChar* "\"" -> String
+ ~[\"\\] -> StrChar
+ [\\] [\"tnr\\] -> StrChar
+
+
+module Stratego-Sugar-Constants
+imports
+ Stratego-Core-Identifiers
+ Stratego-Core-Constants
+ Stratego-Sugar-StringQuotations
+exports
+ sorts Char CharChar
+ lexical syntax
+ "'" CharChar "'" -> Char
+ ~[\'] -> CharChar
+ [\\] [\'ntr\ ] -> CharChar
+ Char -> Id {reject}
+
+module Stratego-Core-Identifiers
+exports
+ sorts ModName ModNamePart
+ lexical syntax
+ {ModNamePart "/"}+ -> ModName
+ [a-zA-Z\.\_] [a-zA-Z0-9\'\.\-\_]* -> ModNamePart
+ lexical restrictions
+ ModName -/- [a-zA-Z0-9\'\.\-\_]
+ lexical syntax
+ "imports" -> ModName {reject}
+ "overlays" -> ModName {reject}
+ "rules" -> ModName {reject}
+ "signature" -> ModName {reject}
+ "strategies" -> ModName {reject}
+
+ sorts Id LId LCID UCID Wld
+ lexical syntax
+ [a-zA-Z\_] [a-zA-Z0-9\'\-\_]* -> Id
+ [a-zA-Z\_] [a-zA-Z0-9\'\-\_]* "*" -> LId
+ [\'] [a-z]+ -> Id
+
+ [a-z] [a-zA-Z0-9\'\-\_]* -> LCID
+ [A-Z] [a-zA-Z0-9\'\-\_]* -> UCID
+
+ lexical restrictions
+ Id -/- [a-zA-Z0-9\'\_\*]
+ Id -/- [\-].~[\>]
+ LId -/- [a-zA-Z0-9\'\-\_]
+ LCID -/- [a-zA-Z0-9\'\-\_]
+ UCID -/- [a-zA-Z0-9\'\-\_]
+
+ lexical syntax
+ "_" -> Id {reject}
+ "'" -> Id {reject}
+
+ Keyword -> Id {reject}
+ Keyword -> LId {reject}
+ Keyword -> LCID {reject}
+ Keyword -> UCID {reject}
+
+ lexical restrictions
+ "all"
+ "case" %% not reserved kw
+ "constructors"
+ "else" %% not reserved kw
+ "end" %% not reserved kw
+ "external" %% not reserved kw
+ "fail"
+ "id"
+ "if" %% not reserved kw
+ "in"
+ "imports" %% not reserved kw
+ "let"
+ "module"
+ "not"
+ "one"
+ "overlays"
+ "otherwise" %% not reserved kw
+ "prim"
+ "rec" %% not reserved kw
+ "rules"
+ "script"
+ "signature"
+ "some"
+ "sorts"
+ "strategies"
+ "stratego"
+ "switch" %% not reserved kw
+ "test"
+ "then" %% not reserved kw
+ "where"
+ "import-term"
+ -/- [a-zA-Z0-9\'\-\_]
+
+ context-free restrictions
+ Wld -/- [a-zA-Z0-9\'\-\_]
+
+ sorts Keyword
+ lexical syntax
+ "all" -> Keyword
+ "constructors" -> Keyword
+ "fail" -> Keyword
+ "id" -> Keyword
+ "in" -> Keyword
+ "let" -> Keyword
+ "module" -> Keyword
+ "not" -> Keyword
+ "one" -> Keyword
+ "overlays" -> Keyword
+ "prim" -> Keyword
+ "rules" -> Keyword
+ "script" -> Keyword
+ "signature" -> Keyword
+ "some" -> Keyword
+ "sorts" -> Keyword
+ "strategies" -> Keyword
+ "stratego" -> Keyword
+ "test" -> Keyword
+ "where" -> Keyword
+ "import-term" -> Keyword
+
+
+module Stratego-Core-Layout
+exports
+ sorts Ws ShortCom LongCom CommChar Asterisk Eof
+ lexical syntax
+ [\t\ \n\r] -> Ws
+
+ "//" ~[\n]* ([\n] | Eof) -> ShortCom
+ "/*" CommChar* "*/" -> LongCom
+ -> Eof
+
+ ~[\*] -> CommChar
+
+ "*" -> Asterisk
+ Asterisk -> CommChar
+
+ lexical restrictions
+ Asterisk -/- [\/]
+ Eof -/- ~[]
+
+ lexical syntax
+ ShortCom -> LAYOUT
+ LongCom -> LAYOUT
+ Ws -> LAYOUT
+
+ context-free restrictions
+ LAYOUT? -/- [\ \t\n\r]
+ LAYOUT? -/- [\/].[\*]
+ LAYOUT? -/- [\/].[\/]
+
+module Stratego-Sugar-Layout
+imports Stratego-Core-Layout
+%%exports
+%% sorts VeryLongCom Eof VLCchar Backslash
+%% lexical syntax
+%% "\\end{code}" VLCchar* "\\begin{code}" -> VeryLongCom
+%% "\\begin{code}" -> VeryLongCom
+%% "\\end{code}" VLCchar* Eof -> VeryLongCom
+%% "\\literate" VLCchar* "\\begin{code}" -> VeryLongCom
+%% ~[\\] -> VLCchar
+%% Backslash -> VLCchar
+%% [\\] -> Backslash
+
+%% lexical restrictions
+%% Backslash -/- [b].[e].[g].[i].[n].[\{].[c].[o].[d].[e].[\}]
+%% Eof -/- ~[]
+
+%% lexical syntax
+%% VeryLongCom -> LAYOUT
+
+
+
+module Stratego-Sugar
+imports
+ Stratego-Sugar-Layout
+ Stratego-Core-Identifiers
+ Stratego-Sugar-Constants
+ Stratego-Sugar-Modules
+ Stratego-Sugar-Signatures
+ Stratego-Sugar-Terms
+ Stratego-Sugar-Strategies
+ Stratego-Sugar-Rules
+ Stratego-Sugar-DynamicRules
+ Stratego-Sugar-Overlays
+
+hiddens
+ context-free start-symbols Module
+
+module Stratego
+imports Stratego-Sugar
+hiddens
+ context-free start-symbols Module
+
+module StrategoMix[Ctx0]
+imports Stratego
+ [ RuleNames => RuleNames[[Ctx0]]
+ RuleDec => RuleDec[[Ctx0]]
+ DynRuleScopeId => DynRuleScopeId[[Ctx0]]
+ DynRuleId => DynRuleId[[Ctx0]]
+ DynRuleDef => DynRuleDef[[Ctx0]]
+ ScopeLabels => ScopeLabels[[Ctx0]]
+ RuleCond => RuleCond[[Ctx0]]
+ Rule => Rule[[Ctx0]]
+ RuleDef => RuleDef[[Ctx0]]
+ Overlay => Overlay[[Ctx0]]
+ SwitchCase => SwitchCase[[Ctx0]]
+ StrategyCurly => StrategyCurly[[Ctx0]]
+ StrategyAngle => StrategyAngle[[Ctx0]]
+ Kind => Kind[[Ctx0]]
+ LID => LID[[Ctx0]]
+ ImportModName => ImportModName[[Ctx0]]
+ Decl => Decl[[Ctx0]]
+ Module => Module[[Ctx0]]
+ StrategyParen => StrategyParen[[Ctx0]]
+ Typedid => Typedid[[Ctx0]]
+ Anno => Anno[[Ctx0]]
+ EmptyId => EmptyId[[Ctx0]]
+ StrategyDef => StrategyDef[[Ctx0]]
+ SVar => SVar[[Ctx0]]
+ Def => Def[[Ctx0]]
+ Type => Type[[Ctx0]]
+ RetType => RetType[[Ctx0]]
+ ArgType => ArgType[[Ctx0]]
+ FunType => FunType[[Ctx0]]
+ ConstType => ConstType[[Ctx0]]
+ Opdecl => Opdecl[[Ctx0]]
+ Sort => Sort[[Ctx0]]
+ Sdecl => Sdecl[[Ctx0]]
+ Wld => Wld[[Ctx0]]
+ ID => ID[[Ctx0]]
+ Var => Var[[Ctx0]]
+ CharChar => CharChar[[Ctx0]]
+ Char => Char[[Ctx0]]
+ Padding => Padding[[Ctx0]]
+ Dollar4 => Dollar4[[Ctx0]]
+ QuotedBracket4 => QuotedBracket4[[Ctx0]]
+ StringQuotedChars4 => StringQuotedChars4[[Ctx0]]
+ StringQuotedPart4 => StringQuotedPart4[[Ctx0]]
+ Dollar3 => Dollar3[[Ctx0]]
+ QuotedBracket3 => QuotedBracket3[[Ctx0]]
+ StringQuotedChars3 => StringQuotedChars3[[Ctx0]]
+ StringQuotedPart3 => StringQuotedPart3[[Ctx0]]
+ Dollar2 => Dollar2[[Ctx0]]
+ QuotedBracket2 => QuotedBracket2[[Ctx0]]
+ StringQuotedChars2 => StringQuotedChars2[[Ctx0]]
+ StringQuotedPart2 => StringQuotedPart2[[Ctx0]]
+ Dollar1 => Dollar1[[Ctx0]]
+ QuotedBracket1 => QuotedBracket1[[Ctx0]]
+ StringQuotedChars1 => StringQuotedChars1[[Ctx0]]
+ StringQuotedPart1 => StringQuotedPart1[[Ctx0]]
+ StringQuotation => StringQuotation[[Ctx0]]
+ StrChar => StrChar[[Ctx0]]
+ String => String[[Ctx0]]
+ Real => Real[[Ctx0]]
+ Int => Int[[Ctx0]]
+ Keyword => Keyword[[Ctx0]]
+ UCID => UCID[[Ctx0]]
+ LCID => LCID[[Ctx0]]
+ LId => LId[[Ctx0]]
+ Id => Id[[Ctx0]]
+ ModNamePart => ModNamePart[[Ctx0]]
+ ModName => ModName[[Ctx0]]
+ PreTerm => PreTerm[[Ctx0]]
+ Term => Term[[Ctx0]]
+ StrategyMid => StrategyMid[[Ctx0]]
+ Strategy => Strategy[[Ctx0]] ]
diff --git a/IBAF-Editor/metaborg.yaml b/IBAF-Editor/metaborg.yaml
new file mode 100644
index 0000000..9c8e5f4
--- /dev/null
+++ b/IBAF-Editor/metaborg.yaml
@@ -0,0 +1,42 @@
+---
+id: org.example:IBAF-Editor:0.1.0-SNAPSHOT
+name: IBAF
+dependencies:
+ compile:
+ - org.metaborg:org.metaborg.meta.lang.esv:${metaborgVersion}
+ - org.metaborg:org.metaborg.meta.lang.template:${metaborgVersion}
+ - org.metaborg:org.metaborg.meta.nabl2.lang:${metaborgVersion}
+ source:
+ - org.metaborg:meta.lib.spoofax:${metaborgVersion}
+ - org.metaborg:org.metaborg.meta.nabl2.shared:${metaborgVersion}
+ - org.metaborg:org.metaborg.meta.nabl2.runtime:${metaborgVersion}
+pardonedLanguages:
+- EditorService
+- Stratego-Sugar
+- SDF
+language:
+ sdf:
+ enabled: true
+ pretty-print: IBAF
+ sdf2table: java
+ placeholder:
+ prefix: "$"
+ stratego:
+ enabled: true
+ format: jar
+ args:
+ - -la
+ - stratego-lib
+ - -la
+ - stratego-gpp
+ - -la
+ - stratego-sglr
+ - -la
+ - stratego-xtc
+ - -la
+ - stratego-aterm
+ - -la
+ - stratego-sdf
+ - -la
+ - strc
+exports:
diff --git a/IBAF-Editor/pom.xml b/IBAF-Editor/pom.xml
new file mode 100644
index 0000000..314a67c
--- /dev/null
+++ b/IBAF-Editor/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+ org.example
+ IBAF-Editor
+ 0.1.0-SNAPSHOT
+ spoofax-language
+
+
+ org.metaborg
+ parent.language
+ 2.5.18
+
+
+
+
+ metaborg-release-repo
+ https://artifacts.metaborg.org/content/repositories/releases/
+
+ true
+
+
+ false
+
+
+
+ metaborg-snapshot-repo
+ https://artifacts.metaborg.org/content/repositories/snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+
+ metaborg-release-repo
+ https://artifacts.metaborg.org/content/repositories/releases/
+
+ true
+
+
+ false
+
+
+
+ metaborg-snapshot-repo
+ https://artifacts.metaborg.org/content/repositories/snapshots/
+
+ false
+
+
+ true
+
+
+
+
diff --git a/IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/InteropRegisterer.java b/IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/InteropRegisterer.java
new file mode 100644
index 0000000..13b4603
--- /dev/null
+++ b/IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/InteropRegisterer.java
@@ -0,0 +1,10 @@
+package IBAF_Editor.strategies;
+
+import org.strategoxt.lang.JavaInteropRegisterer;
+import org.strategoxt.lang.Strategy;
+
+public class InteropRegisterer extends JavaInteropRegisterer {
+ public InteropRegisterer() {
+ super(new Strategy[] { });
+ }
+}
diff --git a/IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/Main.java b/IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/Main.java
new file mode 100644
index 0000000..18a4d92
--- /dev/null
+++ b/IBAF-Editor/src/main/strategies/IBAF_Editor/strategies/Main.java
@@ -0,0 +1,9 @@
+package IBAF_Editor.strategies;
+
+import org.strategoxt.lang.Context;
+
+public class Main {
+ public static void init(Context context) {
+
+ }
+}
diff --git a/IBAF-Editor/syntax/Funcons-pp.sdf3 b/IBAF-Editor/syntax/Funcons-pp.sdf3
new file mode 100644
index 0000000..8019bb1
--- /dev/null
+++ b/IBAF-Editor/syntax/Funcons-pp.sdf3
@@ -0,0 +1,9 @@
+module Funcons-pp
+
+imports Funcons
+
+context-free syntax
+
+ FCT.FCTAppComp = <
+ <{NAME " "}+>
+ > // for pp only
diff --git a/IBAF-Editor/syntax/Funcons.sdf3 b/IBAF-Editor/syntax/Funcons.sdf3
new file mode 100644
index 0000000..e7b49a1
--- /dev/null
+++ b/IBAF-Editor/syntax/Funcons.sdf3
@@ -0,0 +1,87 @@
+module Funcons
+
+context-free start-symbols
+ Start
+
+context-free syntax
+ Start = FCT {avoid}
+
+ FCT-SEQ.FCTSequence = <
+ ,
+ > {right}
+ FCT-SEQ.FCTEmpty =
+ FCT-SEQ = FCT
+
+ FCT.FCTInt =
+ INT
+ FCT.FCTFloat =
+ FLOAT
+ FCT.FCTChar =
+ CHAR
+ FCT.FCTString =
+ STRING
+ FCT.FCTDoubleQuoted =
+ <\\"\\">
+ FCT.FCTVar
+ = VAR
+ FCT.FCTName
+ = NAME
+ FCT.FCTApp = <
+ >
+// FCT.FCTSemantics = SEM-NAME PHRASE-FCT FCT?
+ FCT.FCTTyped = <
+ : > {non-assoc}
+ FCT.FCTComplement = <
+ ~ >
+ FCT.FCTComputes = <
+ =\> > {non-assoc}
+ FCT.FCTPostfix = <
+ >
+ FCT.FCTUnion = <
+ | <{FCT " | "}+> >
+ FCT.FCTIntersect = <
+ & <{FCT " & "}+> >
+ FCT.FCTGroup = <
+ () >
+ FCT.FCTList = <
+ [] >
+ FCT.FCTSet = <
+ {} >
+ FCT.FCTMap = <
+ {<{FCT-POINT ",\n"}*>} >
+
+ FCT-POINT.Point = <
+ |-\> >
+
+ FCT-Quoted.FCTQuotedEmpty =
+
+lexical syntax
+ INT = "-"? [0-9]+
+ FLOAT = "-"? [0-9]+ "." [0-9]+
+ CHAR = "'" ~[] "'"
+ STRING = "\"" STRING-CHAR* "\""
+ STRING-CHAR = ~[\"\n] | "\\\"" | BACKSLASH
+ BACKSLASH = "\\"
+ NAME = [a-z] [a-zA-Z0-9\-]*
+ VAR = [A-Z] [a-zA-Z]* ([\-] [a-zA-Z]+)* SUFFIX? POSTFIX?
+ SUFFIX = [0-9]+ | [\']+ | ([0-9]+ [\']+)
+ POSTFIX = "*" | "+" | "?"
+
+ LAYOUT = [\ \t\n\r]
+ LAYOUT = "/*" (~[\*] | STAR)* "*/"
+ STAR = "*"
+ LAYOUT = "//" ~[\n\r]* ([\n\r] | EOF)
+ EOF =
+
+lexical restrictions
+ INT -/- [0-9]
+ FLOAT -/- [0-9]
+ NAME -/- [a-zA-Z0-9\-]
+ BACKSLASH -/- [\"]
+ STAR -/- [\/]
+ EOF -/- ~[]
+
+context-free restrictions
+ LAYOUT? -/- [\ \t\n\r]
+ LAYOUT? -/- [\/].[\/]
+ LAYOUT? -/- [\/].[\*]
diff --git a/IBAF-Editor/syntax/IBAF.sdf3 b/IBAF-Editor/syntax/IBAF.sdf3
new file mode 100644
index 0000000..219625a
--- /dev/null
+++ b/IBAF-Editor/syntax/IBAF.sdf3
@@ -0,0 +1,12 @@
+module IBAF
+
+imports
+ IBAF-Start
+
+context-free start-symbols
+
+ Start
+
+context-free syntax
+
+ Start = L-start
diff --git a/IBAF-Editor/syntax/Stratego-IBAF.sdf b/IBAF-Editor/syntax/Stratego-IBAF.sdf
new file mode 100644
index 0000000..f8fb2fc
--- /dev/null
+++ b/IBAF-Editor/syntax/Stratego-IBAF.sdf
@@ -0,0 +1,11 @@
+module Stratego-IBAF
+
+imports
+ Stratego
+ IBAF
+exports context-free syntax
+ Module -> Start
+ "|[" FCT-SEQ "]|" -> Term {cons("ToTerm"),prefer}
+
+ variables
+ "START" -> L-start {prefer}
diff --git a/IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3 b/IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3
new file mode 100644
index 0000000..e7f3d6c
--- /dev/null
+++ b/IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3
@@ -0,0 +1,72 @@
+module IBAF-Start
+
+imports
+
+ Funcons
+
+// Language "IBAFlang"
+
+lexical syntax // Language
+ LEX-int = ( [0-9] )+
+ LEX-id = ( [a-z] ) ( [a-z] | [0-9] )*
+
+syntax // Language
+
+context-free syntax // Language
+ L-start.L-start--L-exp =
+ L-exp
+
+ L-exp.L-exp--L-int =
+ L-int
+ L-exp.L-exp--L-id =
+ L-id
+ L-exp.L-exp--R-lambda-L-id-DOT-L-exp =
+ "lambda" L-id "." L-exp
+ L-exp.L-exp--L-exp-LPAREN-L-exp-RPAREN =
+ L-exp "(" L-exp ")"
+ L-exp.L-exp--R-let-L-id-EQUALS-L-exp-R-in-L-exp =
+ "let" L-id "=" L-exp "in" L-exp
+ L-exp.L-exp--LPAREN-L-exp-RPAREN =
+ "(" L-exp ")"
+
+ L-int.LEX-int =
+ LEX-int
+ L-id.LEX-id =
+ LEX-id
+
+context-free syntax // Semantics
+ FCT.T-start =
+ "start" "[:" L-start ":]"
+ FCT.T-eval =
+ "eval" "[:" L-exp ":]"
+ FCT-Quoted.L-int = L-int
+ FCT.T-int =
+ "int" "[:" L-int ":]"
+ FCT-Quoted.L-id = L-id
+ FCT.T-id =
+ "id" "[:" L-id ":]"
+
+context-free syntax // Desugaring
+
+variables // Meta-variables
+ L-start = "(:START" [1-9]? ":)" {prefer}
+ L-start? = "(:START" [1-9]? "?:)" {prefer}
+ L-start* = "(:START" [1-9]? "*:)" {prefer}
+ L-start+ = "(:START" [1-9]? "+:)" {prefer}
+ L-exp = "(:E" [1-9]? ":)" {prefer}
+ L-exp? = "(:E" [1-9]? "?:)" {prefer}
+ L-exp* = "(:E" [1-9]? "*:)" {prefer}
+ L-exp+ = "(:E" [1-9]? "+:)" {prefer}
+ L-int = "(:N" [1-9]? ":)" {prefer}
+ L-int? = "(:N" [1-9]? "?:)" {prefer}
+ L-int* = "(:N" [1-9]? "*:)" {prefer}
+ L-int+ = "(:N" [1-9]? "+:)" {prefer}
+ L-id = "(:X" [1-9]? ":)" {prefer}
+ L-id? = "(:X" [1-9]? "?:)" {prefer}
+ L-id* = "(:X" [1-9]? "*:)" {prefer}
+ L-id+ = "(:X" [1-9]? "+:)" {prefer}
+
+// SDF comments
+
+sorts // ASTs
+ T-start
diff --git a/IBAF-Editor/trans/analysis.str b/IBAF-Editor/trans/analysis.str
new file mode 100644
index 0000000..fc97a5e
--- /dev/null
+++ b/IBAF-Editor/trans/analysis.str
@@ -0,0 +1,34 @@
+module analysis
+
+imports
+ libstratego-lib
+
+imports
+
+ nabl2/api
+ nabl2/runtime
+
+ statics
+
+ pp
+
+rules // Analysis
+
+ editor-analyze = nabl2-analyze(id)
+
+rules // Debugging
+
+ // Prints the abstract syntax ATerm of a selection.
+ debug-show-aterm: (selected, _, _, path, project-path) -> (filename, result)
+ with filename := path
+ ; result := selected
+
+ // Prints the analyzed annotated abstract syntax ATerm of a selection.
+ debug-show-analyzed: (selected, _, _, path, project-path) -> (filename, result)
+ with filename := path
+ ; result := selected
+
+rules // Rename refactoring
+
+ // change last strategy argument to id if multi-file analysis is enabled
+ rename-menu-action = nabl2-rename-action(construct-textual-change, editor-analyze, fail)
diff --git a/IBAF-Editor/trans/cbs-gen/IBAF-Start.meta b/IBAF-Editor/trans/cbs-gen/IBAF-Start.meta
new file mode 100644
index 0000000..3a139d3
--- /dev/null
+++ b/IBAF-Editor/trans/cbs-gen/IBAF-Start.meta
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-IBAF")])
\ No newline at end of file
diff --git a/IBAF-Editor/trans/cbs-gen/IBAF-Start.str b/IBAF-Editor/trans/cbs-gen/IBAF-Start.str
new file mode 100644
index 0000000..efdf17a
--- /dev/null
+++ b/IBAF-Editor/trans/cbs-gen/IBAF-Start.str
@@ -0,0 +1,53 @@
+module IBAF-Start
+
+imports
+ libstratego-gpp
+ signatures/-
+ pp/IBAF-parenthesize
+ pp/IBAF-pp
+
+imports
+
+
+// Language "IBAFlang"
+
+rules
+to-funcons:
+ |[ start[: (:E:) :] ]| ->
+ |[ initialise-binding finalise-failing eval[: (:E:) :] ]|
+to-funcons:
+ |[ eval[: (:N:) :] ]| ->
+ |[ int[: (:N:) :] ]|
+to-funcons:
+ |[ eval[: (:X:) :] ]| ->
+ |[ bound id[: (:X:) :] ]|
+to-funcons:
+ |[ eval[: lambda(:X:).(:E:) :] ]| ->
+ |[ function closure scope (bind (id[: (:X:) :],
+ given),
+ eval[: (:E:) :]) ]|
+to-funcons:
+ |[ eval[: (:E1:)((:E2:)) :] ]| ->
+ |[ apply (eval[: (:E1:) :],
+ eval[: (:E2:) :]) ]|
+to-funcons:
+ |[ eval[: let(:X:)=(:E1:)in(:E2:) :] ]| ->
+ |[ scope (bind (id[: (:X:) :],
+ eval[: (:E1:) :]),
+ eval[: (:E2:) :]) ]|
+to-funcons:
+ |[ eval[: ((:E:)) :] ]| ->
+ |[ eval[: (:E:) :] ]|
+to-funcons-lex:
+ FCTDoubleQuoted(L-int(LEX-int(str))) ->
+ FCTString( str)
+to-funcons:
+ |[ int[: (:N:) :] ]| ->
+ |[ decimal \"(:N:)\" ]|
+to-funcons-lex:
+ FCTDoubleQuoted(L-id(LEX-id(str))) ->
+ FCTString( str)
+to-funcons:
+ |[ id[: (:X:) :] ]| ->
+ |[ \"(:X:)\" ]|
+
diff --git a/IBAF-Editor/trans/generate.meta b/IBAF-Editor/trans/generate.meta
new file mode 100644
index 0000000..d59eeb6
--- /dev/null
+++ b/IBAF-Editor/trans/generate.meta
@@ -0,0 +1 @@
+Meta([Syntax("Stratego-IBAF")])
diff --git a/IBAF-Editor/trans/generate.str b/IBAF-Editor/trans/generate.str
new file mode 100644
index 0000000..9498461
--- /dev/null
+++ b/IBAF-Editor/trans/generate.str
@@ -0,0 +1,118 @@
+module generate
+
+imports
+ libstratego-gpp
+ signatures/-
+ pp/IBAF-parenthesize
+ pp/IBAF-pp
+ pp/Funcons-pp-pp
+ cbs-gen/IBAF-Start
+
+rules // Builder
+
+ // Generates a funcon term for selected AST.
+ generate-fct:
+ (selected, position, ast, path, project-path) -> (filename, result)
+ where path
+ with
+ filename := path;
+ funcons := selected;
+ result := funcons
+
+ generate-fct:
+ (selected, position, ast, path, project-path) -> None()
+ where path
+
+ prettyprint-IBAF-string =
+ parenthesize-IBAF
+ ; prettyprint-IBAF-Start
+ ; !V([], )
+ ; box2text-string(|80)
+
+ to-funcons-start: START -> |[ start[: START :] ]|
+
+ to-funcons-top =
+ to-funcons-start;
+ innermost(to-desugared <+ to-funcons <+ to-funcons-default);
+ bottomup(try(to-funcons-lex));
+ innermost(to-funcons-sequences <+ to-funcons-groups);
+ innermost(to-funcons-apps)
+
+ to-funcons = fail
+
+ to-funcons-default = fail
+
+ to-desugared = fail
+
+// Funcons involved in simplification rules:
+
+rules
+
+ to-funcons-sequences:
+ FCTSequence(FCTEmpty(),seq) -> seq
+
+ to-funcons-sequences:
+ FCTSequence(seq,FCTEmpty()) -> seq
+
+ to-funcons-sequences:
+ FCTApp("sequential",FCTGroup(FCTSequence(fct,FCTApp("sequential",FCTGroup(seq))))) ->
+ FCTApp("sequential",FCTGroup(FCTSequence(fct,seq)))
+
+ to-funcons-groups:
+ FCTGroup(FCTGroup(seq)) -> FCTGroup(seq)
+
+ to-funcons-apps:
+ FCTApp(f1,FCTApp(f2,fct)) -> FCTAppComp([f1,f2],fct)
+
+ to-funcons-apps:
+ FCTApp(f,FCTAppComp(fs,fct)) -> FCTAppComp([f|fs],fct)
+
+ to-funcons-apps:
+ FCTApp(f,FCTGroup(seq)) -> FCTAppComp([f],FCTGroup(seq))
+
+rules
+
+ to-funcons-lex:
+ FCTString(str) -> FCTString( str)
+
+ to-funcons-lex = ?FCTInt(_)
+
+ to-funcons-lex = ?FCTChar(_)
+
+ to-funcons-lex: FCTApp("integer-add",FCTGroup(FCTSequence(FCTInt(s),FCTInt(t)))) ->
+ FCTInt(( s, t))
+
+ to-funcons-lex: FCTApp("string-append",FCTGroup(FCTSequence(FCTString(str1),FCTString(str2)))) ->
+ FCTString( [ str1, str2])
+
+ to-funcons-lex: FCTApp("string-append",FCTGroup(FCTSequence(FCTString(str1),FCTSequence(FCTString(str2),FCTString(str3))))) ->
+ FCTString(
+ [ str1, str2, str3])
+ // generalise to nested sequences
+
+ to-funcons-lex: FCTList(seq) ->
+ FCTString( l)
+ where
+ seq;
+ l := (seq, [])
+
+
+ // l accumulates a list of strings, initially []:
+ to-funcons-string-list: (FCTSequence(seq1, seq2), l) ->
+ (seq1, (seq2, l))
+
+ to-funcons-string-list: (FCTEmpty(), l) -> l
+
+ // 'C':
+ to-funcons-string-list: (FCTString(str), l) ->
+ [str | l]
+
+ // ascii-character("C"):
+ to-funcons-string-list:
+ (FCTApp("ascii-character", FCTGroup(FCTString(str))), l) ->
+ [str | l]
+
+ // ascii-character("\C"):
+ to-funcons-string-list:
+ (FCTApp("ascii-character", FCTApp("list-to-string", FCTList(seq))), l) ->
+ (seq, l)
diff --git a/IBAF-Editor/trans/ibaf.str b/IBAF-Editor/trans/ibaf.str
new file mode 100644
index 0000000..45c333d
--- /dev/null
+++ b/IBAF-Editor/trans/ibaf.str
@@ -0,0 +1,21 @@
+module ibaf
+
+imports
+ libstratego-lib
+
+imports
+ completion/completion
+ pp
+ outline
+ analysis
+
+imports
+ generate
+
+rules // Debugging
+
+ debug-show-aterm:
+ (node, _, _, path, project-path) -> (filename, result)
+ with
+ filename := path
+ ; result := node
diff --git a/IBAF-Editor/trans/outline.str b/IBAF-Editor/trans/outline.str
new file mode 100644
index 0000000..f4bee27
--- /dev/null
+++ b/IBAF-Editor/trans/outline.str
@@ -0,0 +1,18 @@
+module outline
+
+imports
+ libstratego-lib
+
+imports
+
+ signatures/IBAF-sig
+ libspoofax/editor/outline
+
+rules
+
+ editor-outline:
+ (_, _, ast, path, project-path) -> outline
+ where
+ outline := ast
+
+ to-outline-label = fail
diff --git a/IBAF-Editor/trans/pp.str b/IBAF-Editor/trans/pp.str
new file mode 100644
index 0000000..f4e5d63
--- /dev/null
+++ b/IBAF-Editor/trans/pp.str
@@ -0,0 +1,52 @@
+module pp
+
+imports
+ libstratego-lib
+
+imports
+
+ libstratego-gpp
+ libspoofax/sdf/pp
+ libspoofax/editor/refactoring/-
+ pp/IBAF-parenthesize
+ pp/IBAF-pp
+
+rules
+
+ editor-format:
+ (node, _, ast, path, project-path) -> (filename, result)
+ with
+ ext := path
+ ; filename := path
+ ; result := node
+
+rules
+
+ pp-IBAF-string =
+ parenthesize-IBAF
+ ; prettyprint-IBAF-start-symbols
+ ; !V([], )
+ ; box2text-string(|120)
+
+ pp-partial-IBAF-string =
+ parenthesize-IBAF
+ ; prettyprint-IBAF
+ ; !V([], )
+ ; box2text-string(|120)
+
+ pp-partial-IBAF-string(|sort) =
+ parenthesize-IBAF
+ ; prettyprint-IBAF(|sort)
+ ; !V([], )
+ ; box2text-string(|120)
+
+ pp-debug :
+ ast -> result
+ with
+ result := ast
+ <+ ast
+ ; result := ""
+
+rules
+
+ construct-textual-change = construct-textual-change(pp-partial-IBAF-string, parenthesize, override-reconstruction, resugar)
diff --git a/IBAF-Editor/trans/statics.nabl2 b/IBAF-Editor/trans/statics.nabl2
new file mode 100644
index 0000000..31c9b78
--- /dev/null
+++ b/IBAF-Editor/trans/statics.nabl2
@@ -0,0 +1,12 @@
+module statics
+
+imports
+
+ signatures/-
+
+rules
+
+ init ^ (s) := new s.
+
+ [[ _ ^ (s) ]].
+
diff --git a/IBAF-cbs/.project b/IBAF-cbs/.project
new file mode 100644
index 0000000..a850148
--- /dev/null
+++ b/IBAF-cbs/.project
@@ -0,0 +1,17 @@
+
+
+ IBAF-cbs
+
+
+
+
+
+ org.metaborg.spoofax.eclipse.builder
+
+
+
+
+
+ org.metaborg.spoofax.eclipse.nature
+
+
diff --git a/IBAF-cbs/Funcons-beta b/IBAF-cbs/Funcons-beta
new file mode 120000
index 0000000..02b90f3
--- /dev/null
+++ b/IBAF-cbs/Funcons-beta
@@ -0,0 +1 @@
+/home/peter/cbs-all/CBS-beta/Funcons-beta
\ No newline at end of file
diff --git a/IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs b/IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs
new file mode 100644
index 0000000..9985ea3
--- /dev/null
+++ b/IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs
@@ -0,0 +1,47 @@
+Language "IBAFlang"
+
+Syntax START:start ::= exp
+
+Semantics start[[ _:start ]] : =>values
+
+Rule start[[ E ]] =
+ initialise-binding finalise-failing eval[[ E ]]
+
+Syntax E:exp ::= int
+ | id
+ | 'lambda' id '.' exp
+ | exp '(' exp ')'
+ | 'let' id '=' exp 'in' exp
+ | '(' exp ')'
+
+Semantics eval[[ _:exp ]] : => values
+
+Rule eval[[ N ]] = int[[ N ]]
+
+Rule eval[[ X ]] = bound id[[ X ]]
+
+Rule eval[[ 'lambda' X '.' E ]] =
+ function closure
+ scope( bind( id[[ X ]], given ),
+ eval[[ E ]] )
+
+Rule eval[[ E1 '(' E2 ')' ]] =
+ apply( eval[[ E1 ]], eval[[ E2 ]] )
+
+Rule eval[[ 'let' X '=' E1 'in' E2 ]] =
+ scope( bind( id[[ X ]], eval[[ E1 ]] ),
+ eval[[ E2 ]] )
+
+Rule eval[[ '(' E ')' ]] = eval[[ E ]]
+
+
+Lexis N:int ::= ('0'-'9')+
+
+Semantics int[[ N:int ]] : => integers
+ = decimal \"N\"
+
+
+Lexis X:id ::= ('a'-'z') ('a'-'z'|'0'-'9')*
+
+Semantics id[[ X:id ]] : => identifiers
+ = \"X\"
\ No newline at end of file
diff --git a/IBAF-cbs/target/analysis/org.example_CBS_0.1.0-SNAPSHOT/constraint b/IBAF-cbs/target/analysis/org.example_CBS_0.1.0-SNAPSHOT/constraint
new file mode 100644
index 0000000000000000000000000000000000000000..a0326fe715b5b61047bbf2a4b0829f527ecddd42
GIT binary patch
literal 50932491
zcmdRX2Y3`!_x|i=Qx*sv>>33lxF(URf{G*ri9*1HZX+a12&9p0AlQ2^s93PK&x&IE
zu=|OW{G}hPE%_(cnEw5{cQ&F3UHz)9aW1^v~sy2~ZU>wpBF7_`?lqKSt{Ds0=
zXuOsluT3;m#Tye^xAF7J7MA5TC910PCY05WY_6vcd*ECy&gG6PYn)5xQ`6sD^<>{!
zucc_=v0A6bX=9bTHYzO8GiPOalOVfz?G(uco
z*3cLSW8<}qvf8rh#f?=YiJb8y-8@~oc_hhrLw!S>$~^kiH0BkRl7JKO%DTz)b>w(0
zE#A;j*U-2?J5Eak{!~<%~sT4YkCrd~dGT(hs|Z
zSlv-oFL#=o>~nN|ef0;MZm9X@(xvZ(weWZ?0_i8Tp+P~5RWza1$V0Wr{Hh9KIrq?@
z&6(%s79pa_yL}(|_4aqx%wr?#Tvkg=i>_NCUKSX2)!!+N(X(OX<%!a&n)>QEIy4na
zR^6#Akti#lTSLa3(DE#-u{86{>!eOJA8j-s!>@*i^TR>PaSi_3)tLtW4B$m3c
zth&jDdE)GO@$!UV?go(zG{`1hPjb-YPH3u5RDqF_cq1L^w093{k?~q*jC%1&WNHJ)
zm)F(gRo2y2R>$+`u%@n-{;RI0uJVd%YRD(du8!+trE7UpW1_AmDV&7XcYMw4JmxGp
z7NI@3hYP9Vf)r(5?i{b!>6T(~pn=4@H
zKL(p?kObKNrSXQUvg)d%;uT}bmFfIzWd4V08S&~kOp%!Hb*N$!N%_{3()A0uFqT~X
z!jjd~uj$@6usW&P5UF4%Lj{UZb7z+|#&ZkEEaxeLFVZsRl4~odtB8|HR>$YiSlGqn
zS81PDL``)Kk$gJW#2XvSD&s}9bLtY>9_~%_Iy8JHn6;sZhN{ZB37GkA&GpYVem#L*
zTlUq>`KMt}xxz1Nq{(V@V`5T6U46VEk#y2zJ*gHZQmbk!Xd2V{nUG{SC+#~A)=-2>
zgd}Btd@*qBVC4v>1`tj*c)s3Tf8&7kKM38<209sNNwT>HSyQ|zMOwJ3f=DZ_Btd=I
z?bCEDjW9hj#=544@;Ex~h4C8hO&t%ibv(PNs=6XqY1+S(yhnB1Jfj1ld5orjl=5n_
ztsaVL6;zisqCb<%ZJO&BHfX!pI5
z#!M|*)tFE7!Tfk)rq-pZv4H$)bsR%{rq;8nv6$kUc!hd$hpI-A=%nhh@;G9ac!PPJ
zCXlLH_&x+Da5`pWG`^~Ke!N0=Pf-l2$#wIIU2XRulHj_emQFlK_#5Ofg2rbfP2yq{
zHhG9CmKpO?V{UTtgH@W!IQP=U-(LBC-f=wRMrvuCfLwPD;|4*%?r~$|;@Skokfm&u
zCbjd+*Y5M*;~=aRzOCSx|jMMB$Y^1(+=DL%M(
z;fzIdt+?s>ekCdE>QkT|KKtjMbf%IRN?>*3>5!
zo3`4hlP71${H0AQYbdM1lEDmEl-Z630#9#^xysCCB8*tPUOF{Q=wYPc+7)7XNn*x4
zNK+{qkSXeB7BlAr*M>R@HZgJyb?k*9HHc(~=K5Q5X8u6D>|uySp;GJ65VD?L5Os}b`Ev1Oa
zRplHbv(nvWMNPw{@d+)ZF=tRh3+3{BQM`V@R&}^gied_%E7B`!{4IOnjKS{`NYfrw
zVM&-&9A9L@q-k84gMXdr9V^LI-8;b%+5#m2WJB;FW
zztEi&7ASH@2fH-aH{t*OgeJs@rvVpEk)dWZ9!c4RL=H1FjxXEH6%`NT3)vHzE3PJl
z?nAn?2qD&=;B9hiFP8l(vzj1Tg4@
zoWAJ+U=*1Rx*$W7M0mEbgRA8z=Af9%b=uE(PGCc4kGlZ$r~4>y;onCL5LKRa(jhzZ
zQLJFpgIDlTE=Bdd_{bd~$uU=*++~<50?MTcjHVEChTHV~Z=FxNc-=ytKQr~^q*MZ0
z$~vWy@lg~0rUz^?b~-T-*Acau{&aoufAuVcg5yABOhW5SVM0k^X<^CK!ZA!l8HS-_
zsKrQ4OAXr^MXAyF(K9AanN0Hrr5hU(0;4DAJVFUALa-A&j`|V_8Al4nvw(yI)Z0uv
znjv?Wfu)BZH0z9AQZUaiil99RjxL$ptOBG}H(dcC{Mi6z62PJ{g~gML#ugRwq_!lX
zrIi*IOwJjiLX8mRQW|;&)ChN>L*?T$h4iJ|3xsy1fdbgN(ua`pUqnZNT31nj;|fQQ
zvGzylpl;*hWfjGBwZ%;}ldBTdaieRbbh4ZlLoS`OI^x<>4(>Z^Q0l6c9RI669DQao
zvb|NjF!yv+3&2^g&|zY@2Rju@fg1mW-Y}v4qrDQaH9$
zRVj?6w64aKtHt`b7hR<*iMYt-K`{3aibqvaq^(Fvd`_c9MJ;4)v0%)&wPfaJ`+oEk
zyT(W(2S$;(q;gQFAsk7RRaN7-D@E|xPIV`jeMz;0X3xCm`X6)9rtOozAY?hIut1iDBARDegfFOqlvaiUq1x@}6QvJ^
zMsG#UR~fZB)0H#nvlD&N>2tJNi>#9Lif&W6fs1Xeri-Gz*DN%%=`?7g=N(j<5c(T7
z^>!xpA|5WLWuu~HRCO5*Ylx)YC2G7z(mA-Ocnl4Oj4@@D`CeQvDgPFmzKy1DQ`6$n
z6EKcCQS7RZBj!VwuZY~>3^L8558Msh&hB>3UKjRo*9WFHK(|5jA04J?(7L_wtTJJ{pmBNpj;?#)FaW|P0rgbPTd*PJT4eNfdH
z&k1ZX<<$As^hu-75q2I-*@S&%6H2qlrk3b!tJAHt(+w({5Jo-ACX_~ua-p>>8>LAn
zG(n+3HW^84VVK@S2y4O}=!32s?7&TdcupCH(+TxK*Ln*a`j3zhLLuQ7jfH{_zeW@3
ziu(h<-R73nR#Y37Aa2LPwgJ!Nih?9nJbY}4ZVVj*=#})@l|Jwg=j)yprzaBlS`j2^!bmIB-b^<
z&K{-p@$w0D<9Q+7qr)90bLtkA>LOBD5A9Bbl@%x)?X~n7Kp*sZt*y@x-Q$i<9bHnI
zGp4X$JXrEFme3%&C@c+yzH?9vvrRzVkarkEiN(^U*_c0Ue%1x=aFePbD9m-&(g(Z%
z^mR6UbtiolPdsw+#DfcqkHnNk^DFVtBKm!aj)Hy^(C4e@Qxe)%gr5GDCgL@vO>^c{
zHBYK*OwfM@7vgoDPA*hnr9PB~FagRbom_~JG&Gr6b1@TX=U{vwky9B5*aJ`;g0O$e
z*s(>^Rp=U~-?~~;+LBlD><^S!0HYFG`lN}alR*zBOAStif_(_;txz=|(oPORm!3?$
zvZ0WfMJ5-POi*D{Xq$oDhb3AO^K%jL;f9EXAc0_CnZ{Y0MwX!iuThmORl#eiXGk9v
z{!5?1^gIr#V(ayMgC{=#$5N7cYgH|V~Y@Ma9dUp}OOD9hdaj4nWiFOra
zbu1WL%b~$KFJakeW)iI@>9e;^^C>&<6Uq8%;XHbRJ8Bmz^ypz9uO3dP0g*p(O7WP&
zF|L9M*2ObKp5_b|jKYNWFa(3?oqR*l=;F!DhW41DVNch~2?hpqE|WlUo@z80O60k!
z%IJo@jhu_mT|(HDIRZBMDt+K0q08q?xr;6da=H$=p00bsyo4@_k6mWKyj+Ee?ISwO
z0={|AJ9-Sj61ce--xXHEpsw521~1z(o3PxtILTF~7H44K=Bk&2-K3MV)UyokH>eUu
zo^5c8zD=jm*$XQ>4ZgTc5=7wdWn{!c%hirT$RCWQ4=oTv>57&fCIuBtoG^hhM5?&S
zD$?l&F}86SG8W~z7{wh#S1}5B5iAf7pbz+3qjYB`H)zO)5RDhohi<-TpXs%dkrgs)
zrISmFiVq~OrX$Qj?hAtTTEm1^(nYbO2UYg9x9Id}`k<#bO*|nUSC&)rbSEU88(1Vc$w%b>QA9>pU|g(KIrlt
zrAzkjSoeo!wdf9v{6dH;>n+f(%wG}jP^Y2@qp@YkTQmTgMm0g@I%-jmbzmyO)0vq@
zsI~xwC;ZW`HPD-lpCbd>HLI#It1PP_Ue;Jwn>DAdA**b5LsNYs3+Z$+QEcAGl}X0I
zph<}>$dy6EWT^iThV4Q0=}X65O#Rto8R^btX6t7#@uNYPmdT-+biSHCv=k4`H0iR5
zTVol@M|VOjBRLa8Y?9J(8GY-yN24of-_G#@s4rhH!r%e3iwtz5MhY=EbdAXE2WL_zHMAGF&njkzOzod+H!7_#y5
z&*2agG7v(kSSC!Q4`ee?L1<8@fS{lS*cz4DhjuOx?QWW9N
z>Lf#RdMf$YvKoU0FW(l1AJb_Wd@y!8eF%MUtYiXZ$&=4B@mPbp*BUGgH>Ds2+|YO$
zb0N7e<}`4NHnuo^CLLgQh_dI_BY>H&;0
z+@HvZsIaa{Hs;=p?hWOwj@7n1DG3b^(m&3V6;44Nrn4~E)KKUEgHf8ZLRe?d)@uznYsp%M
z4J16o(3q!n!E{CFQz0M}!L3Ug8>n_BR6~i}5jv`&HdNthLY*7P2qd@48$)P&dR?tQ
zS|d9Wo@Mm9i{9%jz1Lx8ui{!o7W*62J*~HbD2Oa(K^B!j8`yfQtc^jz&w8bagOMXW
z7-1a-w_Xzv7!hvVt=DOlVN=l1SyFM}$v>zK^Coc&TyDn&g)gM(+NSF29OH(Yvs?RM
zNFmi?H4vu{d~JcLT3KoQLP_;8g=33~3&-S?6izECnp_xkayZe@*C}A@7r;GL_0;6}
zy3)=)+W%Tn5?@45kC=%^PYXJoi5eQEs3J6tPF3po$13YhwTwCllV5CF-JJX=2DbDam<63G%i`5-ea>
zMQ|r$0)pH`cbgwZu#Y%M4Oh)d`g`Xk{O00-g9wx>*`hWxV&aRnh
zqJTK`5Y;%9K8R-2thS#2p)2VgEQVj8i(<u|8hV43Q^Fh
zL)o}T8G4Sz@jUnDt~xMYMhzF}{g;{jOHjWWba=5Z_p4ou*yQV7gD(iNnP}nzzGx#P
z5t3b}x~M?-HGfULM-&uIVb)2|nFgKkY=yAtk}!A{Q4M_1{UW6nci&>xDEu)s6Ip&n
zD8p+3bru*1Utj?C^!w|qjX}XDKMc=
zUPz}PMNnU;P`64DweYb?P*zVjvONA{>)vIkNem6){eofx6(md|>k0Tbx+vmTTcB|O
z7ygG!p54>E)P+~k&$4w`{iIVK>;O@tTFg_{k$T{vjMx|0^g
z>`TPs?k~X7rBrLN&fa3vc-UWsO@HBauh8^^DZQv`F37{sVE{Lm(wiYB+eu?&HFwIA
z{Tr0pbYwHL>gHszg4}u9hj_Y-$R4HhbeYMM-3Ln6uq7XuvZG-NBZ=Foo8gst+7NgqP8oqjkc|6vE~RM)#<7tX@m$KDqRwD_(;zr9WNdL70O4Ov(W0
zM|`0FAWRwP(m3cKOhFDr=^5So3_`t$Me<<%82Z3s?X0Kl1)4zzp#lg}5K#mhgj_c%
zJ7%k;!L=_zMFe`h4*LpIulB*^m14;XCi0nhoGdW^}9VwE58b!1^6L$~L
z|EK75AF$C4KID*_w}l<|)0vZX!gnczu~LPZ(bMVLk~NZja9bD4qk8PH6|e1u-ZU&r3!wK8PE%$l(JPH%H(`$(O-i+ZH=3TN
z9?qfVLcA7B#*NEQvI?dNjn(XdVjt16~
z7_onD+D<)_sJ}s!FVv|kx8jw|XE&<#G1XYA*Lusu(7McL3MMTv_Y(+q3JRHh0_4?|
z#wVgN3cYcFfhJj^WIJxmX`4=QJUrV{g3K;6ELA=yHV`kteAX$_fcc~}P(f)eDg)dw
zNr7TTBo|s6htDz$&};OjKqHC)BKP$joxvmtXkRMO*qs5IKHd8-c~THP3A8H!4F$_A
zO=2;RF{d{(h8vdG-xDFkOaS%00?Lq=4$6PolX4w{GN{9Xv9P#8r~ZRNomsw>P=|xA
zYEo`u>fjdbxFBeB(o+SP*+ocd3u+w1{bTyJH5UJ%$?hXdWSaz}pz=@P{7D^LO`lze
zg+CP8K=R72!*ma2wvfO{vFxA;V`lvieJH>TPq23sG=Y=y5K&MJ8Xom8I&%$uz`pnQfsfUa?im<8)D!U`l4=_H&^G;a{PVarx8A&D};;sq0(
zqNx-jOzua!UI>RaD}Z?%z5}`~52ZJmB-KknWiG@o1Q|;2IvZQ2TE|dQ`{1_jkrYc>
z5x1u!c-#O0-6UIp>i|}=&ZRLTsX~3-TfNxW#}lWuaCLQ7ytcf$u8~6Wta9bmaam3D
zh*Wh}RRX(#Wa(Vt5scXx^YtZR1gp2wXE)MyiK$NZYv7A1%D<^!YNmzohKR{iAF-ar11Yt?Y^ES_~@WIHSmTF{;CblNj9joudJ-yKB`s(g|?t?=k6vK6rr
zIJpoJ>JUQrWD$6ajxGsfi~w3S!MfWCjVA+^bKosHksXMP$T
zb&rHtPz0B$*?3Qj^rCX8;vb8^^_I$l7c)p7qXOcED$XUF~mkahR>wpG5Xl1
z6CNr`$m^BJZXx82Otf_LGj;M7efFSEe^T_rv31apH!_JRD1I9A7BU|HqYpSZOCfBA
zycl=usRlx(7#;s;)>1-V@uN;LN2XFUv56TLj?SUekJD#&BAI-f094K#1x@Bh4kZdY
zb!r?r0u%y;yu34FmEQlkCQIVwW`a(O_be5@;s#%Rh?i@L=5spTYi)D`Cl4cYh=QUi
zguKWhJ)sjmPa$mP>!B$uU!K)#U8B@uv9=f!M=)iJENdZ4yzWT`V1Rp;5zN&}V^Hvk
zc=RTQ@DMdzMMR#Y4~*g}8+sLx|KdG@&_ae4vq?UD$*n1U66eQuZNO$^<^@*p>?K%qOk
z+#(l&X3*Ou3LwZ$gcs~~3D;Gmot!HzE*vyr-ARjL_Fa}_273rqkuG>%XD|6EFPOr>
zikSYw%hfCX;u^F-p}PbBHCyCbhL~(8jj?9iR$Z#ei@a(1wrFm=wx!#ZdlEaC>|fB?
zv2TJ=*zvkusjzdKA*R7Z7mKUaI^9Q=F{Ze6{}q4acA}sR-a$n85jyjtPWTapusL|q
zJ!-wI*HXFc7d4Yna4!UX9~3l;qe=hUl@Tn!?2QADKZIvWV|4E~{-lXT@?iZX
z`e6LoS&uvknt{ik2?$aUQ3M=+W&`g%0|x9N1od5l{E80yF;lPhapjd#Qw-6vCn~&_
zXud`tge>pd=msBnFlABA%aFut5F-X&wmR@6M@<6{k3uEp#_7(b{%jO;YVkb=?@_{q
zRLtu-Mtg2w8HAq8STnXV_f27<`+;b#(dnvL>eday_lSZr2s;ts@9E4NI^oYvq4F{z
zf_+LfV(7Bx9QQF@6mg<*vIW}t-&cu1qqfEpVt8b*nS8PjZtLRX0R!G!5w|CLQ`~9`
zpby}}p%X!GHs(k*rOIg~Nk9rJ*O|<)CZZkwor-tplS9WFOy$^fW?nAc%$Y_0FzD_@
z$?OYAp=7NZO&ci}m~=T(rkokqmEFy>uPy^m%9S)JuTb+8r=*;WuE=mxI#W0A(R?P-UUUbij|%t?20$kH&vI7SxoOl
zt|~WjAYM92?P?`TBm^6CxZjWO4Ygk(kWP^+=YmKKp&fwHFGMZcrFFCKGJJt
zTIG>iI(am0#aHw|n$P5)IKjKks>-YEk7~OB+lFY1ytap^b^t%K0?xOoySOwCI^U*d
zTN|T$pZQjAVn{J5pAU%=q-c>3xY-jlgU+`KAV@((;XdEG$WcthfJST3lx_s;6CGMt
zQ+1k|IHsIW3X*eQ>$P??Yq7zPnL%$tD=JV`Oc~E^y4@Bw+mtLbl*?cnPV|*IWGm{H
zKKvXwB_cL>kImz*0v@%jb0Mab<)J~^jaEvO+XI6jD>1>`IuA;ZZWca
zNVWjQ7?mq>AYCTaRhKms%DZ%pAu0aD`BX+~p_ODl`8+_;-yD}A!GQjTG#7PAb34`Ul%AC
zH$T${QJV7j3_B5oPMs)jC>TGbv}j^6n`95eBt3(V^NE}|PwW>;Q|k*a;wrNOw_`<02mZuwl0~OdOJ}NVcrSs
zD@2%d&eNOS?b?Fc1xRM5-sjRdus3_a+8BWSyqPpHqzfa2+6YGt7H|
zDA>ZhW;*kiPI!SySg}t84o6e>XbX@>E47fRpg@hTc$(O&XvYBGK;<>k0_8XZuxAkW
zrnNCs5Wgt*-CRU0O$;kR;07N5rVr4o_>+n))${z`=zJ^~FSalasnQLa-Y=Wc!rJ
zDEfiqG0AS$sjHIbknL-t9z0}2oGzL`yHpfDAsZ`8*BCdJN!LZ{Vp$-&+9>93;T(jB
z?Od`bY#o8h6nmEp)+Tfjc#45<7q)+=b`dlVKE?cDX`BiQep8GzF${1hac~}Sld5y0
z-V@}T5(*&yDJBhg6cZUn)XAyvd(j}P^OeDAuGEkoT0*rlbPP&*sC83J8n|F#reRY=
zT2zEd=e)*$8gfO>7St}l6qDA~rE$G
z7#1>^j&C;!vq`7rki1e;dE!YksC#7_)AE=)L_FB&0&DQ6sSB(g(Zw^iE@UO*37FW`
z&2KR1?gc!VjK@EwPuttt7!*>2#`Jn)gAa&`Lc>ruoexD+$~50wuSFp-bGzKmZBU1s
zc7TB$tNpYwROk-Z{|;T+SeM3uNBlw7#^~NBs7#Y4hOClO=uVWNbGsDMCWB_spi-xv
zl!A!DefYYJeX#)pS|5UQC#jLt$8?V`Q&ej^z1Guat=0vLX){@vM)$}G
zt|Y=FA?|*KNm#L>fmCZ1)!JIGwMwbwA1tQL;yxj-augL*PUdk>2}He-e<5qN6Or{y0%5
zJu!CmiAXG~(-u<^I9Nc!jXKy`wrZpdcZ!J+52b9hdl(K|
zE(#hZPz0nK#vKp}ir`^_G*+QSXn7IZ)d@{;@HG2iGdjO;kr;?XO$J(*`b)dlz`hdL
z@25gHYX8(<+Jn}{py0DE)0-IVQk)Z^xIUCE>_+U*J*j{Ktjiu}KnC@mM4eV!{6<-b
zNqGRxCQQ_#S(Bq
zQ-5jSaGwzA_b7gl7AONmb3a-egMwc)Cru0;{kKkb_mCIY^%3#1O5;nYt=@r2f)Vs0bX*A%7w6f!lE*(VS=81oTOb
zabwT8Nh}N1ze*Ot<0f+g%RyrlfirvQU6WjKJ1#`v0V2-yp3cTJgU}5)em$oA&I_T@
zERly{Thus0UOR*}8V$}!wmCBF`4X?#%FLIfZ*S1ui)g(Eq^CjuV#-8+D4eUdR?BUeKB)y9xY+baRFG=5x
z0TYV!T~X`~JVEm%=`m|#PzW3d>5UCOAgcX|kA0n@QhXzMPp(BZS)ilr+y;&A(@Adn
z;2aLdTNT}>@8i-q=uDhW2BG$h?tNxry@?^Kq!d62W@VQ``hlPsbS72+K?))Y_nFuk
zYTMO_8Fn^3Ru~mvWyF)l?MIs0f@dNvD2w?Q>%kJ~OP|#LzxwSn!yyqd&+*
zFHU7PXa>Ex=0=_5!oPP0+ft~rFJyKD>tg%&vhwizpsU)W_)94>qwYqr4y0nntyV
zOV(nsT8o$qJ_T2C_tYf48bu8iG6j1@=;?K?Etmo0EyeuKU%WNn|MBMZ29us41;iPU
z0@ALK@pzLz)}St4|HN&2vq>HN9S!~hJECK)jUgd&M6{J?DkF6n?9#%)N1+EF>1Tjs
zU_WHy0UyFlU_T^sHlWc|86n>g8mB{>V2W7GST_Z3U~JItn*4c!>bT2KD!B;cJVS(_
zm$WZ%?Z0O~{bFZhJ^i+hVOfHpB>7|?+*ZOvM?H9?q+3$zx!@P~iRyRCic{yiP7+)Mo}h0uq;oT%AuVptz7-8d+l
zsEguo#rlw}OTQm9d0+(C^Ot^~0SN7s#-6t@(@h>AIFX+FSaMj8(ZDasr^llP*OcUo
zTtWtb`4J(t`nF@{`e}kfNj{Y4aVr;#lo;1Sa~aW`N;DCg+ut=Q5p>YhUHUVIB#}c%
zM-e&W19GepctFq!MUNa_2lh9p&Ms3F
zYhzIGN!{s940e&aqhZCb$cH9wRcsoJsDS)acj+H6AcHzB3?sBG4b7m_pnjV|-3;6y
zOw^*-(JoA$ID-cUpBnO52kf7VFzKXcVDP1D3u+f2b(j8)OXI-)=m%?K0QU1o(!`K%
zQf|1r2=H)0XkQIb3q*K0kfSTPUw7I*Dsq;a1l(u^pIPE-V5
zSY&jzHU1vWCK`sLQabNkr0^keL-jZjM0YT#t<|P
zbpp@$8DlMtGeE&-#@Cw|T1SHYCE{kD&dp0UZ>9nYFk)q`VNf4N)L$m*^L6SkE7Z*y
zA93Vrs#T-cQc|<69I+*aJf=X;NWA!r*y*k>$S0EX43_xh7H1=G9=zvfgq851v9OPyLOORk$sTiCR
zvd9{;5IA4T%SK)^Ikn#u@bb;(O@WMs5X(R+0_XfQ7O`v$JYmA{1>tF=(Q8
zO>&W+iIs&qD?cl&Ae;&AjLtBrCvp2ZBWYq_!SaJbaC(+n#Hzki8CWvTHUR~2MoSow
zK^@DFpNM*sPW>x|Q!HIGE~6sw>LTM}gI%=a#y-C0a@Q7M$v=^lah0>NNH={O=Fl>5
zl7JLc$ywAT5HQSw%~pz8SiuLubyE_T*|+Y$vH#yc6`}TFMX3&8{jnl6!ngUK<))g+Bg&kajW86a%O&yucav9fVETk0ya2m
z(@`uyF&@R?(q#RBt*}*5X>u4}$iC^Wglurm{%+h2hw!;r{*HM^^HDCrksZ>5(0DkX
z9D35O$5-&t-Z=Rm#?0SG;gJ5i%70SY*?G)`o#`K1uw^{NpO{`?G1UkLPwiEuzjFsy$zF3yfmlZ@
ze~$%qd=A>%!2v7w@oaf;l(qK&1S0-9slBstivDP_(A4Mr*%;q&)86k^?a8a8Td6&e
z$Ug3!3%_K*vHaNQnFbSbH(Zsim5C<-w-ro$=*GlvRwm@dJX^xVF_Zo}jiG0k^m^tj
zot>S=jWXDgSB>4sDE=c<#h+}OcWZ02asSjW9@2|Me5-ZbrB
zVB+ThO#HBgOk_Mk!&wB3;jDI4yM7g&n8Osdd?rrOUkZJC+h&SrCq-r|
zz|_RzMhiYq_c-gETQ%-Kwq~&QDIdWpZpTOJ0Bjr3-eS8A32Xz-LJ5@qFc
zakG`-<&D=ObK_+d1Q25@k|?XHrZ+i`ubG|4K}Q}_%qtpS)tCUWkNX%^SRzEkl;J}hNr@2TYjtSqfdKs@p8{+zF
z^#FyORVowXFU|ESoe#Q(A$uDu)r=m@b=pt$wYrHmXgeDGs!n)xeSP&1s~1isH(STn(R)~mUmS)F
z8|%x;#VX?jV30e*=KRus^4x}ae6)E21D*atVJ(d?l~*@1--G3t`PPqz00AAR@djnC
zwN3IH*E7Cx&25_Nkw(;VQ4C+$pv7#^uxw7mE9-Jg^@Gv1wRMTIL={bug2}ml?pkKl
z!Q=&u
z^gGyt;w3VQ&?(tnr-|j|O%414O`Ms|eS3$L58VFiGsNy5hR#)gLvOaES8+DhRnxC{
z*45?~l;C)wk~FcdGdfqq%jxxdY#Hbq
zEhuGvoTck-OfvQ$oE@6$f7-qokq}m`(MwR6@u@ODv(U_iMSIU_D-9t=B`|cA9}s7M
z|If|r>97*oz^j}+862$r7t|<4F+~B)hj1j@;EL0cOo`^+iYs5B;M77iX4X{47oxx+
zxFo(-y~HaH<(fAG?>=&FF++;2{6031j}UQ58eg?b3ohiX71jI#6s0IQ%6k@9bvby3
zdYAolZ+Gc9fA>+69}L*B60_MlUd;rzWDT%&^C{vHvQHl}@-~pc8ej%UMIUFX(CFu2
zu@r@?Mmyt*Q=^mrI7EVQ&X>r>EGCKEEb=8I>4U!reRj7`4U*QB9FwYIXn!a=6zzL!
z_`-*`euKMd9MYIH3MU7VhVk@5U4%LH%!E*GBN
zVR+XYcoloH;r)(#-x7P8`PF8=-4U%kcwU{Dgtq}fDw3IQKXv>iJ`4=BVFK*L0#H$H
zIAVttL{s}2g&ySL99Ogid0)Y#8O67#%Y`1~X{me3GS4;0-rJ5)E5m2aYI?
zqzfDp%I~GJj?C3KUvZAaxBuQj8Hv9zKn9MHh#*ZJi9>87u~SbGDVX69;sPA`1!tE&
z`s{nGgrzTzcuwxysH2!-B#!6xLG0;cz;rvCNT(hCWfLJDIz?C(N4XgQE=M6!RiilB
zl~tq~VcYbWW7i|o_i~`o6+h)Ji^5cZr7soA#HaWRCL(5tI_<5jVFu`^6uvRZFx2vhNdnDSpQT^+
z4vrcI3Vzrj)NB?NSu3F-cckaccCZRVT?(gkzFF
zVczxJS28BS#%=ti(nopPQ-d5k9cFqCM_v+3DBqam@*#76zg&7JA3@O0k={0(
za~P-1Fcg7-m)R(Eae5lYUen{^m16n*_qw~o@Jf0McoloH;hoRDZ;3r!She^SG>%pt
z-T9Rpn2fgpK`Ju0sROQU>Nv_Yn>NHGnT%XTwQR%Y9|>q_A3<4lGPsSwbNE~O6NiGnP
zGHD>Z07rf?$zJErWnUUy`sW7&F6Pc`G06~+F=GtUpu(b2oIIE1pc-M@^tjxvN2c#J$5Tvlz(c%y1XwPnLWxQKJ!RczfbQhCAuWIR
zWBHyv^jlu7ptd$0U29mPbsY#4BC`*RrR_
z4?TksQ%utHD?Y-E#etTl+JObvIO$vYQT6n%j3N8IYY*V{7V;$XK)=&td;wDmuk}jloO?{t16Q0H9rlTKBa=W(
z!oP8)ctSYFS~y4gOQVnS))9$G-ZwpmBPQV>M|WqQf%q&cH8{(n2fgpK`O#%`>Ep((`?!hlSn30MfJsJxwsh?>P|&6Cc!yoQH@DL
z=`d-a2qA01g|?Pua+DUj{5o#nmL~~yN24Gy2{43uG9g<`!swhM@qy1?QbrPW1##Uz~>msUfawjxiGaz!&+QFQ6-qn;9`Z83?uboBHw)M
z6Ro|M6x>9JcxTReMO_U5mvIx)qEVde!WveMux)yb3ExCo*CW&Snj$GCDS4lsndLl5
z=ibyxnfMfcp_n1nX?JA}F+g|vphdhirGL8rp{RnGWSf%##?17ur>`xJ^
zcol=P;S~$r5`+4vaff+;9<9vmRJ4Mb@U|dGWh&QcKXu3+(;CLGg$?K@gg&ve_{=2jrH*gI~_)+5^K}jzF$znpbpafT3oa@p1
z-=+-3ofsfDPbNy#p{V|b4pNq#&zGUdq^Ss&C@D&R?pbsZU3$)Y*E9Q;r3Kx*QP+;1
zP6qwAw~1UX{4lzI!$iQtiQF4)(Q+C9E}uq)MWZ+=H*nRV(KbEaX4fN|fOk-`)1Sxi
z6AHj`5fw^MqWB9YB4&t+?X9eP4A7l9;?TVCYS|Zez57BIvsQG>cKZR0nd(Q9vxOC$ojfUZaK
zQNWIsNyXMNy92HDlL|kqBvA^c5``+`GEMJ+mc_zzLJQ_|YrmsbFoo>=>hIR`QLJG9
z-c5W&+=rdZkaPQNuPpXv|
z72++;HY2+hr|8ek$hvIHtV^IBGdobR@>-3}+GDA%+*Lz+S0s8aS!C42q`zcq6t$gLNSNI4vvojxg+e~W#jx}_k
z*o-16h%g_8E=SL`|5>l@BlBErWWf_Vb{O7?242NxYUSK%o-lcvfdv!?P