Giter Club home page Giter Club logo

vallang's Introduction

Vallang

Build Status Maven Release

What is Vallang?

Vallang is a highly integrated and mostly-closed collection of mutually recursive fundamental data-types on the Java Virtual Machine:

  • locations represented by URIs: |java+class://java/lang/String| and |file:///tmp/HelloWorld.java|
  • integers of arbitrary size: 1,2,3, 134812345123841234
  • reals of arbitrary size, precision and scale: 1., 1.0, 1e10
  • rational numbers: 1r1, 1r7
  • unicode strings: "hello 🌐"
  • lists: [1,2, 1.0, "hello 🌐"], []
  • sets: {1,2, 1.0, "hello 🌐"}, {}
  • maps: (1:0, "a":"b"), ()
  • n-ary tuples with named fields: <1,2,"a",1.0>, <>
  • n-ary relations (represented as sets of n-ary tuples): {<1,2,"a",1.0>, <>}
  • tree nodes: "myNode"(1,2,3)
  • many-sorted algebraic terms, acting as typed tree nodes: myNode(1,2,3).
  • keyword fields or properties to tree nodes and algebraic data-types: "myNode"(name="Winston"), myNode(age=12)
  • functions: currently only function types are supported, we are working on adding function values.

Operations on these data-types are too many to list here. A selection is listed below, but you should expect the features to be pretty low level; i.e. directly accessing and manipulating the data rather than providing analysis algorithms. Algorithms in the library are added only if programming them below the abstraction layer of vallang provides a major efficiency benefit or it can factors out highly common client code into a reusable feature. More on this design decision later.

  • relational calculus operators such as transitive (reflexive) closure, query and projections, compositions and joins
  • generic tree traversal and primitives for implementing pattern matching

Vallang has a type system based on type systems in functional programming, but note that each value has a most specific dynamic type associated always at run-time. More on the design of the type system below, but here is a list of vallang types:

  • void - the bottom type with no values
  • value - the top type for all values
  • loc - the type for URI locations
  • int, real, rat are all sub-types of the aggregate type num
  • tuple[t1,...,tn] and tuple[t1 l1, ..., tn ln] to represent tuples of fixed but arbitrary arity
  • list[t], set[t], map[t1,t2] as incomparable alternative collection types.
  • node for trees
  • user-defined many-sorted mutually recursive algebraic data-types, acting as grammars for instances of tree nodes: data MyADT = myNode(int a, int b, int c, int age=...)
  • alias types for short-handed type equivalences
  • rel[t1, ..., tn] is an alias for set[tuple[t1,...tn]]
  • open type parameters with upper bounds, &T <: node, can be used to type parameterize composite types (used in type aliases) and to construct higher-order abstract algebraic datatypes.

Sub-typing is co-variant for the container types list, map, set and tuple. Otherwise these rules define the entire type system:

  • value is a strict supertype of all other types other than itself
  • node is the common supertype of all algebraic data-types
  • each algebraic constructor is a strict sub-type of its abstract sort
  • void is the sub-type of all types
  • num is the supertype of rat, int and real
  • an alias alias X = Y is a type equivalence
  • constructor types are sub-types if they have the same name and arity, and they are comparable in their argument types.
    • Within a single abstract sort no two alternative constructors may be sub-types of each other.

There exists an extension mechanism for adding type kinds and their associated value kinds to the vallang system. Rascal, for example, uses this to represent functions and co-routines at run-time. The extension mechanism works by declaring a bi-directional transformation between the extensions and a symbolic representation of choice (chosen freely from the core representation mechanisms of vallang). This bidirectional mapping is mostly used when serializing and deserializing values (see below).

The types of vallang in Java are represented by a Composite design pattern with maximally shared instances of (the otherwise opaque) abstract class Type. These types expose fast implementations of sub-type and type equivalence for implementing fast pattern matching.

The values of vallang are all instances of IValue and sub-interfaces thereof. For every kind of value there is an interface, e.g. ISet, IList, ITuple and IConstructor but they are not type-parametrized because Java's type system can not represent the aforementioned co-variant sub-typing rules we require.

Why does Vallang exist?

vallang is a UseTheSource project recently renamed from rascal-values, which was known earlier as pdb.values.

The project started as a part of the IDE metatooling platform in 2007 as a generic library for representing symbolic facts about source code, for use in the construction of IDE services in Eclipse, then it continued to form the basis of the run-time system for Rascal starting 2009, and finally was renamed to vallang to serve a wider scope.

We designed of vallang based on experience with and studying the ATerm library and ASF+SDF, but also by learning from RSF (Rigi Standard Format), Rscript and GXL and S-expressions. Perhaps JSON and YAML have also had a minor influence.

The main purpose of vallang is to provide a flexible and fully typed collection of symbolic representations of data, specifically "ready" to represent facts about software systems but amenable to basically any form of symbolic data analysis purposes.

This purpose aligns with the mission of the Rascal metaprogramming language which is made to analyze and manipulate exactly such symbolic representations. Therefore vallang is the run-time environment for both interpreted and compiled Rascal programs.

Note that while vallang is a great fit for symbolic data analysis, it is currently not the best fit for numerical data analysis as it features only a uniform symbolic represetation of numbers of arbitrary precision and size (ints, reals, rationals). In other words, the numbers and collections of numbers in vallang are optimized for storage size, clarity and equational reasoning rather than optimal computational efficiency. This also means that indirect numerical encodings of data (i.e. using numerical vectors and matrices), which are often used in symbolic analyses to optimize computational efficiency are not the right strategy when using vallang: it's better to stick with a more direct symbolic representation and let vallang maintainers optimize them.

Next to the maintainers of Rascal, the main users of vallang are currently programmers who write data acquisition and (de)serialisation adapters for the Rascal ecosystem:

  • connecting open-compiler front-ends to Rascal
  • providing external data-sources such as SQL and MongoDB databases
  • connecting reusable interaction and visualization front-ends to Rascal

Nevertheless vallang is a generic and Rascal-independent library which may serve as the run-time system for other programming languages or analysis systems, such as term rewriting systems, relational calculus systems, constraint solvers, model checkers, model transformations, etc.

The latter perspective is the reason for the re-branding of rascal-values to vallang. You might consider vallang as a functional replacement for ECore, an alternative to the ATerm library on the JVM, or an alternative to JSON-based noSQL in-memory database systems, or a way of implementing graph databases.

Finally, vallang is a JVM library because that is where we needed it for Rascal and the Eclipse IDE Metatooling Platform. We hope other JVM programmers will also benefit from it and we have no plans of porting it at the moment to any other technological space.

What are the main design considerations of Vallang?

Vallang values are symbolic and immutable.

We think software analysis is complex enough to be confusing to even the most experienced programmers. Manipulating huge stores of hierarchical and relational data about software easily goes wrong; trivial bugs due to aliasing and sharing data between different stages of an analysis or transformation can take weeks to resolve, or worse: will never even be diagnosed.

Since our goal is to provide many more variants of all kind of software analyses, we wish to focus on the interesting algorithmic details rather than the trivial mistakes we make. Therefore, vallang values are immutable. Sharing of values or parts of values is allowed under-the-hood but is not observable. The library is implemented using persistent and/or maximally shared data structures for reasons of efficiency.

Users of vallang freely share references to their data to other parts of an analysis because they know the data can not change due to an unforeseen interaction. We also believe that the immutable values can be shared freely between threads on the JVM, but there are not enough tests yet to make such a bold claim with full confidence.

Vallang values are generated via the AbstractFactory design pattern and do not leak implementation representations

The reason is that client code must abstract from the implementation details to arrive at the mathematical precision of symbolic reasoning which vallang should provide.

This also serves a maintenance and evolution purpose for implementations of the library. We can plug in a new implementation of the library without affecting client code.

Note that for efficiency reasons values produced from different implementations of an abstract value factory (different implementations of IValueFactory) are not required to interact correctly.

Vallang values uniquely deserialize/serialize from/to a standard and simple expression language

The general rule is that for any two JVM object reference o and p to any vallang object the following rule holds: o.toString().equals(p.toString) <==> o.equals(p)

We currently random test this rule and it sometimes fails due to a deprecated feature called "annotations" which we are removing to make the above contract true.

The intended effects of the toString/equals contract of vallang are the following:

  • What-you-see-is-what-you-get: debugging values by printing them means that you get as a programmer full disclosure about the meaning of the object
  • Structural equality and equational reasoning: the context in which values are created can not have any influence on their identity
  • Sharing is safe
  • Serialisation and deserialisation is never lossy
  • The sub-type relation for types of values coincides exactly with sublanguage concept of the set of sentences for all values of the given types.

The latter point is one of the main reasons why vallang is called a language. The result of anyValue.toString() is a member of a precisely defined textual language. The full textual language is generated from the value type, and sub-languages are generated from the respective sub-types. void is the empty language. In this manner the types of vallang act like non-terminals of a precise context-free grammar. The vallang language as defined above is a strict sub-language of the Expression sub-language of Rascal.

The other reason why vallang is names as a language is because the implementations of the IValue interface and its sub-interfaces are seen as a closed combinator language for computations on the values, and their implementations are interpreters for this language.

Vallang values always know their most-precise concrete ad-hoc run-time type

  • This is nice for debugging purposes, the types are descriptions of values and if matching or equality checking fails then the type abstraction usually explains why without having to go into reading the entire value.
  • Types may be computed lazily or eagerly, cached or not. This is not functionally observable but it may affect run-time efficiency
  • Having precise run-time types for every (nested) value, and having efficient access to this, is a prerequisite for building fast and type-safe rank-2 polymorphic higher order functional computations. Or in functional terms: you need this to make folds and maps work on heterogenous recursive and open data-types. Or in simpler terms: using this we can build statically type-safe data traversal and data transformation features into Rascal.

Vallang values include both trees and relations

Even though both trees and relations are generic enough to represent any data, sometimes a graph or table is more natural than a tree and sometimes the other way around.

  • trees are nice for abstract and concrete syntax representations
  • trees are nice for abstract symbolic domains, such as terms for constraint variables and binary constraints
  • relations are nice for graph-like unstructured data, such as project dependencies, call graphs, etc.
  • relations are nice for access to external data stored in spreadsheets and databases
  • trees are nice for access to web data stored in HTML, XML, JSON formats etc.
  • trees are good for transformation purposes, where we parse something, rewrite it and unparse it again
  • relations are good for analysis purposes, where we extract facts, elaborate on them and finally report the result.

Rascal is a language which can be used to easily switch between different representations of the same information, using pattern matching, querying, comprehensions, etc. From vallang you should not expect any help in this regard: the choice of representation for any information is a key design decision for the user of vallang.

Vallang supports query and (persistent) updates to all symbolic values efficiently

Vallang equality checking is fast

Who contributed to Vallang?

  • Robert M. Fuhrer (IBM TJ Watson)
  • Jurgen J. Vinju (IBM TJ Watson and Centrum Wiskunde & Informatica)
  • Arnold Lankamp (Centrum Wiskunde & Informatica)
  • Anya Helene Bagge (University of Bergen)
  • Michael Steindorfer (Centrum Wiskunde & Informatica and TU Delft)
  • Davy Landman (Centrum Wiskunde & Informatica and SWAT.engineering)
  • Paul Klint (Centrum Wiskunde & Informatica)

and occasional contributions from others please see github's factual overview

What is in the near future for Vallang?

  1. Removal of the "annotations" feature, which is completely replaces by the "keyword fields" feature. The main differences between these features are:
    • While they both offer extensibility to the set of names and typed fields of nodes and constructors, annotations can never influence equals() while keyword fields always do.
    • Syntactically the notation for keyword fields is more compact: f()[@myAnno=1] versus f(myField=1)
  2. Further integration of the capabilities of Capsule for persistent and optimized immutable collections under the hood of IMap, ISet, IRelationAlgebra:
    • Reflexive relations with two indices (for both columns)
    • Heterogeneous collections of numbers (unboxing down to primitive types to safe space)
    • Smooth and incremental transitions from map to multimap representations
  3. IBag, the bag[&T] type

vallang's People

Contributors

anastassija avatar anyahelene avatar basten avatar bertlisser avatar davylandman avatar dependabot-preview[bot] avatar dependabot[bot] avatar epost avatar joukestoel avatar jurgenvinju avatar lemmingavalanche avatar mahills avatar msteindorfer avatar noprompt avatar paulklint avatar pieterolivier avatar rmfuhrer avatar rodinaarssen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vallang's Issues

illegal reflective access in FileChannelDirectInputStream

This warning will become an error if we go to Java 13:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.usethesource.vallang.io.binary.util.FileChannelDirectInputStream (file:/home/runner/.m2/repository/org/rascalmpl/rascal/0.20.0-RC1/rascal-0.20.0-RC1.jar) to method java.nio.DirectByteBuffer.cleaner()
WARNING: Please consider reporting this to the maintainers of io.usethesource.vallang.io.binary.util.FileChannelDirectInputStream

VoidType.isBool() returning true

Hello.

I´m trying to run a Rascal project from Java code. After looking through some stackoverflow questions/answers I got the following code to start things out:

JavaToRascal javaToRascal = new JavaToRascal(new PrintWriter(System.out), new PrintWriter(System.err));
Evaluator eval = javaToRascal.getEvaluator();
eval.addRascalSearchPathContributor(StandardLibraryContributor.getInstance());
javaToRascal.eval("import String;");

This ends up in Rascal´s JavaToRascal.eval() line 157.

public Object eval(String command, String scheme) {
	Result<IValue> result = evaluator.eval(null, command, URIUtil.rootLocation(scheme));
	if (result.getType().isBool())
		return new Boolean(((IBool) (result.getValue())).getValue());
	if (result.getType().isInteger())
		return new Integer(((IInteger) (result.getValue())).intValue());
	if (result.getType().isString())
		return ((IString) (result.getValue())).getValue();
	if (result.getType().isBottom())
		return null;
	if (result.getType().isList()) {
		return _listValue((IList) (result.getValue()));
	}
	return result;
}

By debugging I can inspect result.getType() and see that it´s a VoidType. But result.getType().isBool() returns true and the code branches in the first if condition. This results in a NullPointerException as result.getValue() returns null.

I might be completely wrong here, but is VoidType.isBool() supposed to return true?

Out of curiosity I inspected the returns of result.getType().isInteger(), result.getType().isString(), result.getType().isBottom() and result.getType().isList() and they all return true aswell.

new failing test for function matching

this is a part of solving usethesource/rascal#1468

the following test fails on the current master of vallang:

@ParameterizedTest
    @ArgumentsSource(ValueProvider.class)
    public void testHigherOrderSelfMatchOfFunctionType(TypeFactory tf) {
        Type returnType = tf.parameterType("Ret");
        Type arg1 = tf.parameterType("Arg1");
        Type arg2 = tf.parameterType("Arg2");
         // &Ret curried(&Arg2 arg2)
        Type curriedFunction = tf.functionType(returnType, tf.tupleType(arg2), tf.tupleEmpty());
        // &Ret func (&Arg1 arg1, &Arg2 arg2)
        Type parameterFunction = tf.functionType(returnType, tf.tupleType(arg1, arg2), tf.tupleEmpty());
        // &Ret (&Arg2) curry (&Return (&Arg1, &Arg2) func, &Arg1 arg1)
        Type curry = tf.functionType(curriedFunction, tf.tupleType(parameterFunction, arg1), tf.tupleEmpty());

        // First we rename the type parameters for the purpose of parameter hygiene:
        Map<Type, Type> renamings = new HashMap<>();
        curry.match(tf.voidType(), renamings);

        for (Type key : renamings.keySet()) {
            renamings.put(key, tf.parameterType(key.getName() + "'"));
        }

        Type renamedCurry = curry.instantiate(renamings);

        // now we self apply the curry function with an add function
        Type addFunction = tf.functionType(tf.integerType(), tf.tupleType(tf.integerType(), tf.integerType()), tf.tupleEmpty());
        Type curriedAdd = tf.functionType(tf.integerType(), tf.tupleType(tf.integerType()), tf.tupleEmpty());

        
        Type curriedCurryReturn = tf.functionType(curriedAdd, tf.tupleType(tf.integerType()), tf.tupleEmpty());

        // the goal is to arrive at a binding of &Ret to an instantiated int (int) curried function, via parameter matching
        Type actualParameterTypes = tf.tupleType(renamedCurry, addFunction);
        Type formalParameterTypes = curry.getFieldTypes();

        Map<Type, Type> bindings = new HashMap<>();

        // this is where the bug was/is.
        // applying curry(curry, add) should give `int(int arg2) (int arg1)` as a return type.
        formalParameterTypes.match(actualParameterTypes, bindings);

        // instead we get the uninstantiated version &Ret' (&Arg2') (&Arg1')
        System.err.println(curry.getReturnType().instantiate(bindings));
        assertTrue(curry.getReturnType().instantiate(bindings) == curriedCurryReturn);
    }

add IString::asReader to stream _from_ strings

  • IString's can stream to a writer using the IString::write(Writer w) method.
  • This is beneficial because IString's internally can be lazily concatenated and indented, and you don't want to duplicate the entire contents just to stream the contents
  • But, IStrings can not be streamed from yet, only to a Writer.
  • The dual of a Writer in Java is a Reader
  • So, let's add IString::asReader

Implementation considerations:

  • IString has a lazy UTF32 character iterator implementation already
  • Either the asReader method lifts on this thing, or it duplicates some of its design to replicate a reader
  • The trade-off is between code-reuse and buffering efficiency; a specialized Reader could dump entire lines or blocks of characters of bufferSize to its clients using System.arraycopy, while the character iterator always goes one-by-one.
  • Perhaps just wrapping the reader with a BufferedReader would have the same effect, and then we might reuse the (pretty complex and distributed) character iterator implementation?
  • Ask @DavyLandman about this.

failed wysiwyg random test with a complex example

For the record:

[ERROR]   IValueTests.testWysiwyg:51 reading back "59"(false,-6)[@FgG1217=($6404-03-11T09:37:06.202+00:00$:<"","">,$2020-10-26T18:36:56.342+00:00$:<"kc","햿ŏŤD">,$0374-02-28T13:59:16.535+00:00$:<"","">,$5254-11-30T22:54:53.946+00:00$:<"","f792">),@JhI4449=[$2020-05-31T23:30:19.184+00:00$,$2020-03-24T01:33:01.663+00:00$],@vRf1459=false,@Okrg81h=1193539202r2144242729] produced something different ==> expected: io.usethesource.vallang.impl.fields.AnnotatedNodeFacade@52d84959<"59"(false,-6)[@FgG1217=($6404-03-11T09:37:06.202+00:00$:<"","">,$2020-10-26T18:36:56.342+00:00$:<"kc","햿ŏŤD">,$0374-02-28T13:59:16.535+00:00$:<"","">,$5254-11-30T22:54:53.946+00:00$:<"","f792">),@JhI4449=[$2020-05-31T23:30:19.184+00:00$,$2020-03-24T01:33:01.663+00:00$],@vRf1459=false,@Okrg81h=1193539202r2144242729]> but was: io.usethesource.vallang.impl.fields.AnnotatedNodeFacade@693b3903<"59"(false,-6)[@FgG1217=($6404-03-11T09:37:06.202+00:00$:<"","">,$2020-10-26T18:36:56.342+00:00$:<"kc","햿ŏŤD">,$0374-02-28T13:59:16.535+00:00$:<"","">,$5254-11-30T22:54:53.946+00:00$:<"","f792">),@JhI4449=[$2020-05-31T23:30:19.184+00:00$,$2020-03-24T01:33:01.663+00:00$],@vRf1459=false,@Okrg81h=1193539202r2144242729]>
  • This happened on my local machine and is not reproducible without knowing the random seed. The example still needs simplication, but there is enough information to copy the parameter values and call the test again manually.
  • io.usethesource.vallang.impl.fields.AnnotatedNodeFacade has toString implemented the right way, so it's something deeper?
  • junit5.Assertions.assertEquals only prints the class name and the object if the strings are equal. So in this case the strings are equal but equals is not true.

Parametrized data-types with extra unbound parameters lose `void` binding

Describe the bug

rascal>data D[&T] = D();
ok
rascal>D()
D: D()
rascal>data E[&T] = E(int n);
ok
rascal>E(1)
E: E(1)

Both E(1) and D() should have reported a parametrized type, namely E[void]: E(1) and D[void]: D() respectively.

This may have to do with the interpreter using tuple types with field names to represent the types of type parameters, but if at least one of the field names binds to void (in this case all of them), then tuple[...,void,...] reduces to void and it looks like there are no type parameters at all.

There is a special tuple type in vallang that does not reduce to void like the above and we could use that to represent type parameters instead of the use-facing tuple type which must reduct to void for type correctness' sake.

random isomorphicTest failure during CI

[ERROR] testIsomorphicText{IValue, IValue}[1333] Time elapsed: 0.016 s <<< FAILURE!
org.opentest4j.AssertionFailedError: (|Da:///7w/gSfqB/Y/avO7N/06/gf96/0/52/5498/622h/4/8KTb/%C2%A9%C2%A3/LCdq|:"y"(4.875329280939582,false,$2020-02-19T01:25:19.036+00:00$),|cj://W03|:"YPE"(),|IZwo:///vcV|:"df"("iRe"()[@zynZaJw=-404415087088.54184696206636425,@aeI6931=[],@BTlDgfs=0.0],0),|lcJr:///rmG7?C=dqen|:"AHZQ"((),{-1721001437r1218015923})[@Wta4336=true,@TLGcrBZ=false,@UwzdGnJ=[false],@DBnDip4=true],|l:///94/4|:"aRH"(1333314580r109079989)) and (|Da:///7w/gSfqB/Y/avO7N/06/gf96/0/52/5498/622h/4/8KTb/%C2%A9%C2%A3/LCdq|:"y"(4.875329280939582,false,$2020-02-19T01:25:19.036+00:00$),|cj://W03|:"YPE"(),|IZwo:///vcV|:"df"("iRe"()[@zynZaJw=-404415087088.54184696206636425,@aeI6931=[],@BTlDgfs=0.0],0),|lcJr:///rmG7?C=dqen|:"AHZQ"((),{-1721001437r1218015923})[@Wta4336=true,@TLGcrBZ=false,@UwzdGnJ=[false],@DBnDip4=true],|l:///94/4|:"aRH"(1333314580r109079989))should be equal because they look the same. ==> expected: io.usethesource.vallang.impl.persistent.PersistentHashMap@3ca3cc0<(|Da:///7w/gSfqB/Y/avO7N/06/gf96/0/52/5498/622h/4/8KTb/%C2%A9%C2%A3/LCdq|:"y"(4.875329280939582,false,$2020-02-19T01:25:19.036+00:00$),|cj://W03|:"YPE"(),|IZwo:///vcV|:"df"("iRe"()[@zynZaJw=-404415087088.54184696206636425,@aeI6931=[],@BTlDgfs=0.0],0),|lcJr:///rmG7?C=dqen|:"AHZQ"((),{-1721001437r1218015923})[@Wta4336=true,@TLGcrBZ=false,@UwzdGnJ=[false],@DBnDip4=true],|l:///94/4|:"aRH"(1333314580r109079989))> but was: io.usethesource.vallang.impl.persistent.PersistentHashMap@629cc6bd<(|Da:///7w/gSfqB/Y/avO7N/06/gf96/0/52/5498/622h/4/8KTb/%C2%A9%C2%A3/LCdq|:"y"(4.875329280939582,false,$2020-02-19T01:25:19.036+00:00$),|cj://W03|:"YPE"(),|IZwo:///vcV|:"df"("iRe"()[@zynZaJw=-404415087088.54184696206636425,@aeI6931=[],@BTlDgfs=0.0],0),|lcJr:///rmG7?C=dqen|:"AHZQ"((),{-1721001437r1218015923})[@Wta4336=true,@TLGcrBZ=false,@UwzdGnJ=[false],@DBnDip4=true],|l:///94/4|:"aRH"(1333314580r109079989))>


persistent factory map fails random io test

Deep random value failed, now trying to find the simplest sub-term which causes the failure...
Test fail:
Not equal: (seed: 672550873)
([{-1307563167,-8,0},{},{}]:<{true,false},0.0,[["","","","ŜǤň홠","",""],[]]>,[{},{},{},{},{},{}]:<{true,false},0.0,[]>,[]:<{},0.0,[["","","\u00a0\u1680\u00a0\u1680\u2000\u2028 "]]>) : map[list[set[int]], tuple[set[bool],num,list[list[str]]]]
([{-1307563167,-8,0},{},{}]:<{true,false},0.0,[["","","","ŜǤň홠","",""],[]]>,[]:<{},0.0,[["","","\u00a0\u1680\u00a0\u1680\u2000\u2028 "]]>,[{},{},{},{},{},{}]:<{true,false},0.0,[]>) : map[list[set[int]], tuple[set[bool],real,list[list[str]]]]

TypeFactory should keep types in a weak reference, as it currently leaks

After running rascal quite a while, and running multiple programs, the TypeFactory gets quite big, in a recent session 1 GB of memory was kept around by the TypeFactory . Analyzing the heapdump showed that the signatures of all the functions, and all their previous versions were in there as tuple-types, similarly for ADT's that had slowly evolved.

I understand why the TypeFactory exists, it makes type equality a reference check. And we should keep this. But if we store the types as a WeakReference, than they'll disappear from the factory cache, as soon as nobody references that type anymore.

The TypeStore might be a different story, as we often register stuff in a store, and only later use it.

failed random serialization test with only a stack trace

[ERROR] testSerializable{IValueFactory, IConstructor}[96]  Time elapsed: 0.391 s  <<< ERROR!
java.io.IOException: Constructor was missing type
	at io.usethesource.vallang.io.binary.message.IValueReader.readConstructor(IValueReader.java:708)
	at io.usethesource.vallang.io.binary.message.IValueReader.readValue(IValueReader.java:452)
	at io.usethesource.vallang.io.binary.message.IValueReader.readTuple(IValueReader.java:505)
	at io.usethesource.vallang.io.binary.message.IValueReader.readValue(IValueReader.java:463)
	at io.usethesource.vallang.io.binary.message.IValueReader.readConstructor(IValueReader.java:683)
	at io.usethesource.vallang.io.binary.message.IValueReader.readValue(IValueReader.java:452)
	at io.usethesource.vallang.io.binary.message.IValueReader.readTuple(IValueReader.java:505)
	at io.usethesource.vallang.io.binary.message.IValueReader.readValue(IValueReader.java:463)
	at io.usethesource.vallang.io.binary.message.IValueReader.readConstructor(IValueReader.java:683)
	at io.usethesource.vallang.io.binary.message.IValueReader.readValue(IValueReader.java:452)
	at io.usethesource.vallang.io.binary.message.IValueReader.readValue(IValueReader.java:72)
	at io.usethesource.vallang.io.binary.stream.IValueInputStream.read(IValueInputStream.java:90)
	at io.usethesource.vallang.io.binary.SerializableValue.readObject(SerializableValue.java:108)
	at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1158)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
	at io.usethesource.vallang.io.binary.SerializableValue.read(SerializableValue.java:58)
	at io.usethesource.vallang.basic.IoSmokeTest.testSerializable(IoSmokeTest.java:48)

but notice the weird character in this error message from the AppVeyor log:

IoSmokeTest.testSerializable:48 � IO Constructor was missing type

Add informative error messages to asserts

The valling code contains quite some asserts (very good!)
Unfortunately these asserts just throw assertionError without further information.
I just spent hours figuring out what went wrong.

Proposal add to all asserts informative error strings that describe (where relevant):

  • arity
  • expected type, found type,
  • index of offending argument or field
  • ...

PersistentHashIndexedBinaryRelation project specialisations do not update the type bags

The project method of PersistentHashIndexedBinaryRelation simply swaps the value type bag with the key type bag in case its detected that a binary relation is inverted, but the invariant checked using checkDynamicType is sometimes not held after the invert.

Code which inverts a relation and has asserts enabled will trigger an AssertionError since the PersistentHashIndexedBinaryRelation checks a type bag invariant at construction time.

Two questions remain:

  • how to write a small test which will break the functionality of the inverted object even when assertions are off?
  • how to fix this effectively without introducing too much overhead?
@Override
      public ISet project(int... fieldIndexes) {
        if (Arrays.equals(fieldIndexes, ArrayUtilsInt.arrayOfInt(0))) {
          return domain();
        }

        if (Arrays.equals(fieldIndexes, ArrayUtilsInt.arrayOfInt(1))) {
          return range();
        }

        if (Arrays.equals(fieldIndexes, ArrayUtilsInt.arrayOfInt(0, 1))) {
          return thisSet;
        }

        // TODO: replace by `inverse` API of subsequent capsule release
        if (Arrays.equals(fieldIndexes, ArrayUtilsInt.arrayOfInt(1, 0))) {
          // return SetFunctions.project(getValueFactory(), thisSet, fieldIndexes);

          final SetMultimap.Transient<IValue, IValue> builder =
              SetMultimap.Transient.of(equivalenceEqualityComparator);

          content.entryIterator().forEachRemaining(
              tuple -> builder.__insert(tuple.getValue(), tuple.getKey()));

          return PersistentSetFactory.from(valTypeBag, keyTypeBag, builder.freeze());
        }

        throw new IllegalStateException("Binary relation patterns exhausted.");
      }

Arithmetic division by zero not handled correct

Entering just "3/0" in the Rascal REPL correctly reports ArithmeticException("/ by zero"). However, entering "0/0" evaluates to 0, which I think is incorrect. As it turned out, this had to do with an 'optimisation' in the evaluation in the class io.usethesource.vallang.impl.primitive.IntegerValue.

I corrected and tested this, and issued a pull request. #7

Reduce allocations during WeakWriteLockingHashConsingMap::get

The special class io.usethesource.vallang.util.WeakWriteLockingHashConsingMap$LookupWrapper is constructed a lot.

Running java flight recorder it's the top allocation by far when running a rascal compiler. It also shows up in quite some places in the trace.

Possible glitch in project operator.

rascal>("a" : 1, "b" : 2, "c" : 3)<1,0,1>;
java.lang.IllegalStateException: Binary relation patterns exhausted.(internal error)    at $shell$(|main://$shell$|)
java.lang.IllegalStateException: Binary relation patterns exhausted.
        at io.usethesource.vallang.impl.persistent.PersistentHashIndexedBinaryRelation$1.project(PersistentHashIndexedBinaryRelation.java:587)
        at io.usethesource.vallang.impl.persistent.PersistentHashIndexedBinaryRelation$1.project(PersistentHashIndexedBinaryRelation.java:488)
        at org.rascalmpl.interpreter.result.RelationResult.fieldSelect(RelationResult.java:371)
        at org.rascalmpl.interpreter.result.MapResult.fieldSelect(MapResult.java:286)
        at org.rascalmpl.interpreter.result.MapResult.fieldSelect(MapResult.java:318)
        at org.rascalmpl.semantics.dynamic.Expression$FieldProject.interpret(Expression.java:908)
        at org.rascalmpl.semantics.dynamic.Statement$Expression.interpret(Statement.java:365)
        at org.rascalmpl.interpreter.Evaluator.eval(Evaluator.java:882)
        at org.rascalmpl.semantics.dynamic.Command$Statement.interpret(Command.java:125)
        at org.rascalmpl.interpreter.Evaluator.eval(Evaluator.java:1090)
        at org.rascalmpl.interpreter.Evaluator.eval(Evaluator.java:959)
        at org.rascalmpl.interpreter.Evaluator.eval(Evaluator.java:914)
        at org.rascalmpl.repl.RascalInterpreterREPL.evalStatement(RascalInterpreterREPL.java:115)
        at org.rascalmpl.repl.BaseRascalREPL.handleInput(BaseRascalREPL.java:99)
        at org.rascalmpl.repl.BaseREPL.run(BaseREPL.java:283)
        at org.rascalmpl.shell.REPLRunner.run(REPLRunner.java:45)
        at org.rascalmpl.shell.RascalShell.main(RascalShell.java:126)

negative array index in `index`

java.lang.NegativeArraySizeException
	at io.usethesource.vallang.impl.func.SetFunctions.index(SetFunctions.java:547)
	at io.usethesource.vallang.impl.DefaultRelationViewOnSet.index(DefaultRelationViewOnSet.java:76)
	at io.usethesource.vallang.impl.DefaultRelationViewOnSet.index(DefaultRelationViewOnSet.java:9)
	at org.rascalmpl.eclipse.editor.IDEServicesModelProvider.getDefs(IDEServicesModelProvider.java:104)

matching an ADT with an open type parameter throws an exception

io.usethesource.vallang.exceptions.IllegalOperationException: Operation getTypeParameters not allowed on value
        at io.usethesource.vallang.type.Type.getTypeParameters(Type.java:595)
        at io.usethesource.vallang.type.ParameterType.getTypeParameters(ParameterType.java:92)
        at io.usethesource.vallang.type.AbstractDataType.match(AbstractDataType.java:418)
        at io.usethesource.vallang.type.TupleType.match(TupleType.java:414)
        at org.rascalmpl.interpreter.result.ConstructorFunction.call(ConstructorFunction.java:230)

This was reported first here by @tvdstorm : usethesource/rascal#1467

And it is caused by this line of code:

return super.match(matched, bindings) && fParameters.match(matched.getTypeParameters(), bindings);

random test failed on remove-annotations branch

[ERROR]   BinaryIoSmokeTest.testLargeBinaryFileIO:91->ioRoundTripFile:249 Not equal: size: 20213) 
	[{},{"Nfo"("",<>)},{"IiNF"(["a"("6661oxe3A",|ri:///|,202740110r1336426093,-247028709r92865034,-430344557r1742684033,NcD452J={},xBy0061=987917863r857047883,tDwV869=[-1910548003r1582095115,1265326131r1312874710,-913195469r263745436,-384035791r130936270]),"tJ"(),"r"({}),"R"(),"Q"({},hxoKvXO=[],Qte1630=[],iivAWuw=[],Fwk1372={},dRC5208=("":(1719479274r1440941435:0,1800655545r630275447:-823088611,-1067360729r1687582977:0),"\u2028\u2000":()))],[|kLh:///47/196|],-191987891r145349935,(():"",(|pAR://K/0MW39/18889|:(0.0:-776577867,0.08347395169605365:175981478,-3.5633663671893356:7,1.7217743661405005:-5),|EAc://hDyPS/wgZd/lTvQ|:(0.0:0),|JJVz:///8/WqxI|:(0.0:162541429,7.901791311415369:9),|oHR:///788A/4702/nn93/JYd/597/11/z|(119,335):(0.0:0),|kAH:///33|:(0.5403119150760305:0,-0.8700610119297923:0,9.78686363479314:0),|pfu:///1|:()):"8",(|HS:///|:(),|ex:///|:(0.0:1684608726)):"",(|EHNeD:///g|:(),|K://6Jqr/05|:(0.0:0,-0.29991044572461045:0),|VRC:///32|:(0.0:-8,-4.939366259983949:28916630),|wOqjfh:///rJz/OH836|:(0.0:524778707,3.780472220421278:1,-946381288881.5007364722332448:795444148,5.53764213930085:774420385),|dCrcp://jNPi/7/6NNXF/1|:(0.0:2,7.233804284709154:0,-0.13781656282216392:6),|RBuDvj:///9|:(0.0:2,0.024768580465314827:1)):"䕉푿㭡Ĭǖ퐁퓨퐣"),{},4,1552654073r1998872207,0),"pspv"(|FwgAnxAM:///RKRd/30A/D460|,{true,false},0,[],-5.962501210103618,true,[]),"3"([[]],1697894413r1278849571,{},"","gW"(-3,"n"(false,"",[(0.0:-3,"J"([$2020-11-16T14:30:25.272+00:00$]):9,30751365r18303886:0,<"\'3"(<52477927r168164542,"138i">,|K://TSeMa/1/TN1|),false>:0,-11884529r769620:-6),(),(),(true:0,0:0),({<[<|c:///O/F/w4/1/FiN3/ES/2BJC/31/1R/284/XkM|,"QSZ"()>],"TLA"(false,YeKoME5=$3284-12-08T19:57:28.077+00:00$,sFEifhp=<[]>,pHWqbJt=0),"Ǫ㳬㟿𠟻𒃬"()>}:0,33068395376481050729449512072707616547274463562493117840:0),((-8:"",0:"mO"):0,<0,[]>:7,|C://tOkDe/4|:0,|Aii://kv|:-382966261,{1093097644,0,-1306437088}:-2)],$1062-08-11T00:30:35.837+00:00$,"rCUX"(<80114943r1636628063,true,149837406r378290243,|ZUz:///|,["6"(<|o:///+%C2%AA/U5/3835/9|,-2059490408r428568151>,[],ecJ9251=[272106712r921337507],VYh9Tr5=2),"14600"([886787656r29372797]),"𠝱𠛅𠩃𠔌"(),"Dp"(<>)]>,"Auf"(343652689r596763499,{true},{},"kH"),{<[$5265-07-21T16:21:58.900+00:00$,$2338-02-01T02:08:46.109+00:00$,$2020-05-16T17:37:33.070+00:00$,$2020-02-16T12:04:42.604+00:00$],<"750"([],EaK625V=-5,KXZ2712={[]})>,"e"()>},0,SOc1171=0,Xla9342=|MVdx:///s/38553|(270,329),Uec7173=$1833-03-08T03:55:56.120+00:00$,WNV8335=<0.831862718179891,$2020-03-30T06:04:06.242+00:00$,(<"퀓nj㤓햅䱮"()>:"nSMS"(),"zun"():"r"({},true)),"헰㱄ƞ"(HkI6369=(),ogp6181=[{{""}},{{}},{}],vhZoNLz=(|j:///|:$1592-04-20T21:05:33.152+00:00$,|wC:///4|:$6996-03-03T16:10:42.180+00:00$)),"TBgt"(-2067503r1059612,"ec"({476814491r1780513961}),<<>,{(),{$4755-09-11T17:44:31.891+00:00$,$0191-08-05T10:11:07.801+00:00$}},"06"()>,bDdb577=0)>),-1,enc3724=<true,-217503583,0.0,|CYhsL:///|,false>,DIpU778=<{{5,-2,-492360181}},{{},{"䂹䰊𠖩𒁵𠎵"([<"18049"(),0.0>,<"WU"($2020-07-03T16:52:32.250+00:00$),0.0>],|Mw:///|,$2985-04-23T13:16:44.751+00:00$,"𒈠𒀗𒆵"([],"X"(),"FqT"({$0346-07-30T03:27:49.626+00:00$},()))),"T"((false:[]),-725651463r1681327232,0.0,false),"An"(yTxpk70=(),EHRiMxZ=true,Brp9990=493451195r200157218,rEP5133="FaWaZ"({$2224-05-02T10:22:56.524+00:00$}),eWV558N=[])},{"sOVqz"(),"\u2000\u2000\u2029\u1680\u1680"()},{"SrTD"($1080-07-23T12:51:03.593+00:00$,0.0,8),"tTB"("Ǹŵ䳖ř䐧폘Ď")}},"CFkWA"(0,{$2020-12-22T15:31:00.012+00:00$,$2020-11-19T13:52:28.461+00:00$},$1625-08-09T08:43:55.802+00:00$),"\"\'"([[],[{0.0}],[{}]],0,<(),|Cn://WsQ/%E4%A4%A9%E4%94%91|,"jDbw"(-68337824r91388965,{{},{"","DeYXo"}},WpsWNGY=[],ncso153=({}:"RnTq"()),aDu0607=""()),"OxT"(911677883r1944673990,"𒇔𠵕")>,|jrK:///t0/0OEdz?QIiM=dRS|,Czq90NI=[],ebEPkl8=8.035292717751872)>,BBR4861=<{},false,[]>,fNY0148=-9,bxtFNXj=0.14861629091114636,WOt67PN=[])),|ewaJ:///f/96508/S5s/84M/w|(388,288,<106,439>,<191,123>),|htQkEaMg://154Ig/h8/6/83n8/yG|),"l"(0,[],$2020-10-14T10:27:54.668+00:00$,0.0),"㓇䯖𒀃𒂢"([($2279-06-06T14:18:54.167+00:00$:{},$3097-03-27T08:49:21.585+00:00$:"",$1453-04-07T18:18:51.180+00:00$:"buk"(IRT2690=-23099895224578065291348158257607145409,mBZ1717={},ilN2859=[]),$3162-01-20T03:54:44.333+00:00$:3.3989877119481458,$4471-01-21T11:03:28.694+00:00$:|kJcJxw:///351xr|,$2017-03-25T11:46:34.701+00:00$:<"31097">),(),($6864-02-06T17:42:17.887+00:00$:(),$2020-12-02T22:17:57.160+00:00$:0,$3807-11-12T00:04:15.400+00:00$:"HCgO"),($0962-12-17T14:56:28.855+00:00$:<-1619258518,<[],[],<"7094"([],"66936"("gkk"())),"qyFo"($5526-07-12T02:44:51.032+00:00$)>,"kj"(|pIJ:///6a/eY|),"jVtS"(),"MwvZ"({592005765r1080883724},{},false)>,"\n\t\t \t"(true,{},<>,WJx5676=<5>,MGZ0975=<>,QJhYV21={},XDfYXpd={"033\a03"(0.0,true)},xEx91yR=$1688-08-27T10:05:15.751+00:00$),"¬\a07¥\t"(<|p:///IJqX/5d8/UX|,[0,0]>,1,-2)>,$3950-05-27T23:50:58.592+00:00$:-5,$6440-10-11T19:49:23.110+00:00$:<0,"5467",[]>,$2020-08-22T04:55:33.618+00:00$:"Dwy8"),(),($6695-10-25T11:42:02.353+00:00$:0),($0385-11-27T11:50:37.063+00:00$:false,$1406-12-21T05:37:43.091+00:00$:true)],{}),"sFrB"((),0," \t\t\t"($4692-06-26T19:27:02.611+00:00$,true,[$1791-02-17T03:50:17.804+00:00$,$6105-04-18T06:22:11.506+00:00$,$2020-06-21T15:23:49.029+00:00$],[],"",AUe0jRJ=<{},$0569-01-24T01:07:56.949+00:00$,|edni:///uQ162|>,ujf738r={},qpk2374=false,yPJ2tQg=|f:///|,vKh2576={},inD631n=false,beH7493={{},{$5054-04-10T00:32:57.914+00:00$},{$6477-01-13T13:57:14.640+00:00$,$2020-10-09T04:38:57.451+00:00$,$3608-11-26T18:24:01.551+00:00$,$3770-08-09T05:47:05.653+00:00$},{$3108-03-16T05:29:55.845+00:00$,$2020-11-25T13:02:36.223+00:00$}}))},{},{},{"\a07¨%&\""(|iDbNTrt:///|,""(-2,|NWK:///y9|,$4456-07-05T16:28:08.372+00:00$,0.0,$4245-10-21T14:22:48.780+00:00$,{}),|WrZlgCZP:///7q2/z/ws|),"64803"([],|tiHIu:///HAot|,"hlB"(0,{},<0.0>,-0.7840689014253521),|RNYB:///|,-188185557r276723745,<<-4.957961182272442,[[],[],[],[],[<|kHj:///9l2/22|,"Ě탷훭ǀĆ"()>,<|Sn:///|,"\n\t\u205f\t"({},<"YXsv"(),-2000132702r1456528919>,gdu28fj=[])>,<|Kf://uD/B314n/oaX|(88,423,<22,380>,<172,413>),"m5"($5938-05-03T01:50:56.273+00:00$,IPUdK2J=$0543-03-08T16:13:01.424+00:00$,IDLOoAK=(),qygDpTh={""("킇ż𠰄㓌ģ"()),"uOdI"([|l:///|])})>,<|cqk:///l8OIH|,"㤛텧"($2020-11-28T10:16:48.323+00:00$)>,<|V://kDfu4/46/%20VP|,"\t\t\t\n\t"()>],[]],"`\\\<\<\>"(iqUyIhm="\t\n\t"(-571467697,{[]},"\<@\<"("`"(<696060095r1916230653,"햡㭜퀑햁"()>,{$2020-03-15T23:55:36.622+00:00$},BKxib03=0),muH7499={}),[]),HHb254T=0.0,Clv903u="53",dAE8403="\>y"(true,[],"8345B",yeG0624=false,fwo9147=<["𒄯"()],"MxUoJ"(UVI2545=<0.0>),<>,"MXl13"($2020-08-08T08:14:41.235+00:00$)>,qzk9179=-1030920077r1020028583,yBG4378=true),hRk935i=<<false,"","Cce"($4311-01-15T04:35:22.022+00:00$),"ćʼnlj폫풀"()>>,MVeenlx="Keq"(<{},{"oPi"(),"𒁤𠽝𠘋𡄒"()},"\"\<\\`\\"("",[]),"uWc"([[]],[])>,<-1140768503r1241276226,[[],[[],["lDR"()]]],"QQ"([],"3"()),"3"(-1775660175r350276438)>,|g://8/FH38|,[""(),"Wn"(BHl1638=|tE:///6/kERzD/492/772DU/3|,UudXh97=|u:///|,aim9281=-0.6220176717487477)],fgScGJt="",DnD38LQ={},zBjWByV=[($2020-01-04T03:08:39.462+00:00$:"d"(QGnPBRO=$0164-04-11T14:27:26.726+00:00$,asV8804={}),$2150-01-11T03:19:19.066+00:00$:"HJWT"(false),$0671-05-04T08:09:14.723+00:00$:"P"($0759-09-02T01:01:22.698+00:00$)),(),()],pfO212W=0)),"LJĽ"([<>,<>,<>,<>,<>],698750815,{},|JRalR://oP0p/othbT/ail|,$0394-08-12T06:56:46.742+00:00$)>,$2503-01-12T10:17:11.074+00:00$,<>,[],-7.922073961180347,"yGu"({},<"bZzC"(-332397709r662042650,"909734",-848095250r234890557,fojSgZG=585825125r258776301,IMh3735=true,CsQnzP2=3,ruc07f3=29913931017.109828929082318164,njcCjh6=0),{},true,$2020-05-04T16:07:57.322+00:00$,"\u3000 \t\t"({[]},$1832-04-15T21:32:27.384+00:00$,FzADrAM={},kbrUJZR=$5705-10-18T15:28:04.481+00:00$,HkawpcY=<0.0,891316169r253030105,"𒄸𠙚㑹㔯퀴"(<>,{}),"Xs"(("5"(mkdwigN="SjF"()):"nx"(NQc36x5="X"()),"\t4\n"():"VSF"()))>,kQtNiBq=0,bfdV042=0.0),""(<(9:"LNO"(<{}>),-260763765:"㤉홓푈큚䲨"(|D:///1p7/759/E5C/4/p/9UFrz|),0:"aN\n\t"(<>)),"Kjjo"({},[],Xzwq072=<2128200853r110327574>,lmQ21kV=$2020-02-19T21:53:51.682+00:00$),"ǀ퐇통䗄"(IZpGEm7=()),"wF"(CSiuNOC=0,hwg414N=0)>,|NPR:///H49|,"mbI"("",[7.73866141632894,1.2571591373885616],<<>>),true)>,2.6541957930138507),"xx"(bKk1661=([{},{},{9,2,0},{4,0},{}]:{},[{},{},{},{}]:{},[{}]:{},[]:{}),LbQQS28=$2020-09-30T22:34:55.699+00:00$,EFp8400=false,bzMRg19=-400516909r173298731,RvL9362={},SPk0966=<>,mXCcQWh=())>),""(<{<630045147r59609300,404656945r835636892,"Q"({0},(),[163129780r446713659],{},{}),"si"(NIQ3mC6="C"([],""),yrQ43oF=(38196811r6557822:92148647r50300440,-170317281r191768188:-940906436r565024473,576298337r617467013:-371537411r1483809441,48325007r127630381:-2119074317r1699772074,933582467r784620399:-266517874r700488321),eKC33FZ="322"($0158-09-07T18:02:27.995+00:00$,<>,|t:///tk|),Jlr7957=[],VOc1bjI=false,uTB9731=-0.3806121426528689),"bCOi"(0.0),"\'\\`\"@"(|Oa:///Eb0/9vZ06/3FNW9/qhh3/12|,tUJ437f=0.0,XEA5835=$6507-05-11T12:41:28.825+00:00$,HqE149x={|w:///0845/rjefB|,|Gugrd://Ld956|},HfJMvf0=0)>,<0.0,1358171614r913725993,"iXTt"((false:0),-997941044r465129267,{},VOVbN06=<>,KCUBjxJ=$4869-09-21T22:05:38.632+00:00$,kmO603J=$2020-09-28T20:35:40.512+00:00$),"\t"(),"kpLqp"((),10664284r325983239,9.38098033715299)," \tcNC"(<[],0.0>)>,<|bsNZzt:///|,-437056454r266430083,""(0,<"CxM"(-2106157403,-4.303908324901805,{0.0,-2944766519214.8773634979268968,3.2055194434496714}),""(FJg3464="LTv"(-1308061101r67660700,[-129433566r2073875239],azu0005=288532802,GKii4p4=""(true)),vVRB369=-344688306r15077513,MEc479u=-690079647r77612281,tLs3089=false),0>,1748134373r97366442,roz5989=0.3043462660978582,ATStk5q="016"($0838-02-20T22:33:04.904+00:00$,[{}],"",()),uOghrfC=|V:///eRc/0/Hkqs|),"t"(""),"2"([],{},|MQk://z26690/36q/u4269/2o|,{},cCaCnBw=-1760543726,WoA665y=-311137003r145390591,WwBWfT3=1873744523r327682360,SWO77bj=0.0,nai2253="¦\t§"),"9"(128338925r14029568,[],[[<0.0>],[],[],[<0.0>,<1.9811041373754712>,<0.0>,<6.010061989506205>],[<0.0>]],cQy729l=[],RLk765a=false)>,<0,426964477r132322739,"j"($4460-01-02T02:51:10.733+00:00$,-1893629275r214010198,|gTXS:///|,173314714r165599609),""(<>,false,(),{},()),"7duE"(<<"D"(-2135649193r501833176,[]),"su"(<>),"ǩ𠮥"({},{(),(true:""())}),"B"({{("iwWW"():"9YP"(),"YQ"(IlR4494="Q"()):"9"(DSk0622="HUD"()))}},{},VvVEoXz=<>),"\u2029\u00a0\u205f\u0085\n"(132486115r924997791,<>)>,"cCPk"(<"Jj"(),["80"()]>),"vXNw"([]),""(<"",$2020-10-12T18:14:18.523+00:00$>,$3170-05-09T21:41:04.191+00:00$,true),"21U"($1520-07-27T11:35:37.889+00:00$)>),"㺜팎Ő"({<{},"d "({"","Uz"}),"\t\n"(|buG://V59d/PfX/173/Gx0|,true,|l:///TnCdB/Nh/gIx/341B|),"𒈋𠲠𡃺𒅨𡇗"(-8,XFDAs43=<>,sJa0Dfp=()),"jaX"()>,<{[]},"jI"(|C:///hh|,|fDK://7960|,HyX3256=["W\a00"(rsU6AWw=<"Q"()>),""(),"\t99"(0.0)],KsjAZaN=<[],{},"dvub"([])>,QKVYCk8=(),IZgW13Y=<(),true>),"MDt"(""(),[]),"D"("",{|MDg:///UNvK/5622|,|P:///6057/wa/33|,|q:///Vu/LW/CKGB/34730/y/6/2/MfCfo/T10/hy/6746/rVZ/Qtwh/mNlFV/n96|},|Qh:///F/8e3/I|),"PVy"()>,<{},"lK"(),"XuKp"([],-453308859r779874673,{}),"\"\>\<@\>"(),"z"(1054610268,oiW3971=$2020-11-18T21:06:28.501+00:00$)>},[$4245-02-23T05:49:12.306+00:00$],0,[{"",["䏤䬞Ǖ䳟䝎䇫",""],$0125-12-16T13:23:20.644+00:00$,({}:"MDca"(sFg0pVE=[{"l"()},{"TiJd"()}]))},[$2020-02-26T04:02:07.928+00:00$,$6206-04-22T10:09:00.023+00:00$],0],<[]>)>,<{<({}:["㯃훣폮ǟƴ"()]),[]>,<$2020-02-12T10:01:28.475+00:00$,[]>,<<$5421-01-18T14:10:12.591+00:00$,[<>,<>,<>]>,[0.0,-3,0,-206234088,0.0]>,<-519690729r1614353414,[0.0]>,<[],[1613846943r1995723152,0,-6.565210862087189]>,<[],[-0.07802516195981768,-0.49146357567563437,0.0,-2032806529r941481412]>},350990207r409685253,"43"(-2015095193r1234418984,|eJh://076P9/1406|,[0,4.2536420425371935,0,-2.8316220578556637,8]),"SHv\t6"(),"7\t "(|Ey:///4/%E2%80%A8%C2%A0%E3%80%80%09/96e4|,<{},$0928-09-25T15:27:16.802+00:00$,7>,[],<{[-0.8878865616910192]},"IWUj"(6.241300337584793,|anR:///|,$3433-04-26T14:37:33.925+00:00$),"No"(<$2020-09-11T12:35:54.406+00:00$,3.360763272501166,"\>"(0)>,$2020-10-07T08:20:28.642+00:00$,$1672-03-12T01:33:56.034+00:00$)>,EwXgH73=(),pve1985=0.0,NDyyMD8=$6316-08-17T08:26:33.501+00:00$,MsCwVcZ="7KiK"({},"ivO"(<>),<{},{}>,ibMzBak={})),"2"()>,<0,-2123872314r1407764249,""(1.4405471323663577,"",pAC762D="87"(91375533r388437086,<(),""(3,pxI3878=1111241422,PEJ395b={})>,<>,0.0),Rgg7784=1855686655r427610484,bsUa9tI=-1,mRiwEnO=false,cdQG09u={(),([]:(),[-1001781839r783775822,1761461083r687990569]:(0.0:"a"()))},jnn747h=$5055-05-03T20:21:31.675+00:00$),"\<"("",$2020-09-02T20:23:13.530+00:00$,false),""(|ggZT://sVG/GUH3|,{})," \n\t \t"(0,["RQ"(),""(zYMbUAI=()),"%ª#\a06"(),"㲛㪏"(),"ar"($2020-01-06T14:04:20.055+00:00$)],{$2020-09-07T20:14:47.808+00:00$,$2020-07-19T06:13:05.624+00:00$})>,<{},-236036058r692639729,"\'\a03¢©l"($6028-06-26T01:32:50.684+00:00$,RFy5880=(),WynsMjE=[],zYzpVU6=181990023r17026897,VoP18Qy=[],lLI475r=$6167-06-26T23:00:50.358+00:00$),"E"($1223-12-26T08:23:36.373+00:00$,true,-9.285576977685137),"㲂䋾Ǻ푵𠝟"($2067-05-05T22:30:44.970+00:00$,[|C://4804l|,|xjv:///?i=4099&DsKs=iN7I&J=7&bWkJ=U|],{}),"mvF"({{{""},{"","퉨Ķ㾅폒䱀틝Ÿ"}}},|rKFLa:///|,$3648-05-13T11:36:42.404+00:00$,78340901r1640563220,["pcmJ","","","",""])>},"JBT"("",{})>,$0798-01-15T08:03:37.897+00:00$),"K"(-1825029270r1011514069,{},<<{},0.0>,false,|aGFLW:///464|,"54152"({},Cveapxi=""),|yOFekv:///wbo8/g6/AnTg|>,|tWhPW:///byRxt/SKFKl/25W/107/8|,[|fJh:///|,|x://Aj/M0|,|gw:///|,|VSTx:///684/kSJ/I|,|mZAi:///|,|hQg:///Biv/eO/ew|,|De:///|],<|C:///WT609/cYFb|,{[]},{[],["Sx"(<(),""()>,{}),"ynY"(6.595575871573368,[]),"ZU"(0.0)," \t\t\t\u3000"(true,"ƍ䫔㭸𒆈𒇥",true,0.0,|Bt://1/79/s4O|)],["2228P"(-684578588r80281413,[|I:///7F|,|MVCl:///|,|e://SkC200/FF16/8049|(75,128),|KiT:///|,|uv:///|]),"e"(("yh88552":<(""():"T"([]),"ZzZ"(|U://sTzo/%C2%A0%E1%9A%80%C2%85%09/UCk/es/vc/92C/LnV|,Zcu43Lk=<>,RoXPzKP=0.0):"rfD"(),"Eu"(["S"()]):""([()])),"7217"({},qtK9QEP=$6371-06-25T12:41:08.902+00:00$,xUtFIUZ=|PV://uAG/Heh|),"nkMZ"([["c"()]]),"NegJ"("f"())>,"@펮qj":<("䲒펝Ǖ"(-0.5704154767518133,HXZ1034=["Jl"()]):"oP"(),"77490"([]):"𒂇䓃햶䖧"(-715986497r631455491)),"\u1680\u2000\u2028\u1680"(-854784426r763226825,true),"SRb"(<"픞"()," \n"()>,-254270968r950783181,yxM67a7="",JYgpyPw={},Jargawu=({}:"x"(LZsvs51=""()))),""()>,"𠀁𠭭펽㺿":<(),"001"([],<"">),"frL\'\""(tQV8296="05j",zeRgqT5=()),"mfDJ"()>,"\>":<("jzjp"(<>,jrlBK06=$2819-01-07T14:49:51.425+00:00$,Klt8815=$1980-06-22T11:07:33.101+00:00$):"¡&"(("\u2000"():"PMQ"())),"툄"():"kb"()),"mk"({0.0},$3075-07-02T11:02:52.117+00:00$),"`"([]),"cyOo\a03"("\n \n"(488942450r795215031),-189566893r111294662)>))],["퐎şƜ"([],<{{},{<0.0,"\t23"($2020-08-26T07:56:25.961+00:00$,0.0),"Yy"(XvW433B=|K://b|,wjtVH01=true,PuQ0948=-3.8718690944594867),"06421"({{}},-1340367360)>,<2.051491486666359,"47"(),"Gqw1x"({""}),"-$㓷㛝"(<>,("Vzmy"():"\t"()))>,<0.2605708599294486,"77234"((<"">:"VVUI"())),"H"(TxzDCyU=(():"QzmQ"(tEUzbNn="455"()),("sTv"():"퓡dz"()):""())),"vtq"()>},{<1.4679672957588241,"vug"(),""(),"yhx"()>},{<0.0,"LnC"(),"HNiv"(<>,-73894850r537322891),"dbt82"({(|G:///|:"HtUf"(),|Q:///9|(238,79):""())},{-77591626r36173131})>,<-0.40171440349814047,"lmMP"($2020-06-13T20:56:06.010+00:00$,0),"B4"(<{"JO"()}>,[{"폤䏟"()}]),""("EM"(),$5676-12-13T18:38:25.143+00:00$)>,<0.0,""(-690709139r509393520,3.6575126946515857),"䰸트䢖"(fPh4227="nfZ"(0.9947389104512592),JcQa1y5=1422932273r1815446021,GiskCtj=-41648982r110111215),"a1"("",{{},{[],1.5018086962506738}},cZt2ydu={})>,<-9.653387189720119,"w"(false),"SU"(<0,41651116r1692726329>,hpj4489=""),"6"({<>},false)>}},(),"ddd"(""(),[])," ZY툞"("",1117085757r1956003938,"")>,<0.0,false,"404856",<"ZEg"(),"폒㴆훧"("",-1928789424004188683771915857635379509),"g"(true,$4798-06-20T22:30:35.659+00:00$),"mZp"({},YaE0953=(),Scj0072=5.435250674873898),"zRW"()>>,<{0.0,3.3622939335167903,0.5298618852274211}>),"\u2000\n"(<()>,-1746421823r1171970936,false,qvacBh8=true,lWz0132=1659357624,nHMkyfX="OgiV"(<>,[{},{}],true,|NRdW:///NpDr7|),rORaP1L=|ICmf:///70|,PuvlJNd=[],EoXWpFd=$3720-09-04T08:56:43.599+00:00$),""(104181019r1040572601,<$0972-10-16T00:39:28.241+00:00$>,Yuv141v=|LEceS://Uzxouo/Vqw76/vm/7941/68/4V/td9/9/L|,Jqw2jkS=<true,"",361383115,[],"56385"(|w:///863|,"G"(),"핻㚞ĕ픠",pym1456=[])>,YHjWC2C=$2310-03-22T22:06:30.233+00:00$),"a"((),|xM://7/9a#5|,KMt0050="",vlt0181="",bviVUpa=<>,rCR7fCx=0),""([],<"","12D">,-4.508906330890756,<"",0>,CGayn0c=1764337793,VhybCj8="Yb"(7,310809099r1066835612,$6007-06-28T06:56:16.874+00:00$),Zlh310T=0,OKt2101=608728105r624638044),""(<>,|fz:///|,HLJ7485=0.24139708728375442,pGZl251=({"\u2000\u2028\u0085\t\t"}:()),SBR8827={},RwR9302="95mV",lZIGweq="𒈼𒅷𡐞𠓄"())]}>),"PnCo"(false,false,"𒍢𒊌𡒢𡎶nj"(1.320930939223639,0.0),44656487r1731159073)},{""(),"81h"("","",5,{""([{},{0.0},{4.957651616209526,-716923027r149049865},{}]),"lA"(|O:///i/9|,["51"($2020-01-03T10:52:58.308+00:00$,0.0),"CI"({},548722049,|XcuN:///G/3m/xx7|,""),"M"((),true,<>,"",false),"L"($0178-02-26T07:21:52.831+00:00$,621261903r1581794500,<|XO:///5BM/Kxo|,[]>,true,0.0)],|cX:///|),""(|aJ:///EUM/nL28/EaC/w/lYnG|,<{|Yun:///191f|},-473652456r101160997,$2020-04-20T12:20:21.021+00:00$,<520083610r518173371>,"ĝ폐䳯"(dgE5331={"","Ƃ䖠䭀"}),"OIq"(({}:"781"(),{<"\t\t"(),""(),"J"()>}:"틢ŝ횠"(),{<"Tfk5u"(),"\n\t\t"("JbJ"(()),-1026058439r1376380591),"nYr"()>,<"73"(),"dY"({}),"fIA"()>,<"𡁸𡆫𒐁𒑛𠜕"({},""(0.0,bdP0fTp=<>,wYOZIGw=(():"횄횥"()))),"¨)VK"(<|s:///|,(""():"dH"())>,1257174723r2070251749),"jClp"("P"({}))>,<"4g"({},<0>),"풿䱝퉻㻢"(JIxGLnh=|R:///|),"l"(LZP7523=0.0,ZeNf61V=|I://1496/LNm/6/pFX6/73875/pcQx/gs0/709gV/540/sCRN/hVWX/H/dGy/39/z/Khmoo/J6/9h/0/zk/53/If|,Hxq5054=[])>}:""([],$4528-09-09T17:33:41.243+00:00$,0),{<"V"(),"u"(),"Zhf"(537324861,aEH5332=[-8.433059675883424,-8.167465993004047],ydKeiz1=703594279r758090107)>,<"575"(<>),"hWsE"($2020-08-11T06:01:28.027+00:00$,HRrGD53=<0.0>),"K7"()>,<"\>"([],{}),"68823"(1366834106r143263173),"IKykh"()>}:"vAO"({|M://11643|,|v:///|,|A:///6224/Xm856/905/S|},true,true)),<[],$5980-12-02T23:01:32.190+00:00$,0.0,[],"qFcq"(|BKy:///19627/03|(191,116,<415,490>,<789,438>),[])>,<|iAOz:///0/bMHjh|,$2020-05-08T04:50:22.731+00:00$,{-414788258r193777943,1111257008r2030080665,-1155823666r1501727283,-241910713r506303255}>,-0.9720940549371769,<>),"\t "([{$3415-05-18T02:21:08.599+00:00$},{$4049-12-28T04:53:12.866+00:00$,$2892-11-29T18:41:05.650+00:00$,$6418-12-23T15:31:01.954+00:00$},{$3056-12-06T07:59:52.251+00:00$,$2020-02-17T05:53:03.091+00:00$,$3824-08-17T08:26:08.121+00:00$,$2065-04-06T00:31:43.365+00:00$}],{})>,8,"ZPpfYoeVB",167937983r378439828,1069031154r106189417),"3"(-1771202133r364194611,[],8),""($1782-04-18T22:57:46.037+00:00$,$0838-04-26T11:55:11.497+00:00$,0,$0812-10-29T12:08:10.307+00:00$,-1463433171r1706862047,"VyRE"(0,{<>},"9320D"(),|RTL://WtR|,125793223r130245618),{}),"263NI"(0,0.0,<"㚮䥗䟕Ź펄튥",[{{}},{},{{},{{},{"","햛햁푢톎헟ƴ","099560"}},{{},{"\n\t\t\t\n\u1680"}}},{},{{{},{"","펡","N"}},{{"","vZW755"},{"","\n"},{"","415@56Zb"}},{{""}},{}}],{"","\t\n\t\n\t\t\t\n","펼ǖ텸㲎㽭䀣䀹","oJx"},"2T"(),"XG"({},0),"R"("y",-42651217r16562018,$6872-01-22T20:30:23.455+00:00$,<-5895122859472173498776623435784465114714308110374652484067753941651514354327722612974682968784,0.0,8.863085555032491,0>),"oMxEY"(7.864182824654805)>,true,true,[])},{{0.0},{}},<{}>),"j"("\u0085\t",1962851909,qCnh05Q=-242618684r1186397409,SyS3871={},SQPv9nj=[<"3bDZuTH",<-1218289674r1503198253>,<-1676593105r1938498543,"gj"([]),"443T"(false,-443923691r1425214357,<$2020-06-10T12:02:14.177+00:00$,|oua:///916d|>,153797478r104154787)>,"턶ƫ㺡"(eEFbUoV=-1633797809r135782911,hKH4754="",EXCS71H=<>),"p"("P"(-826150747,{},1350979325r1269230564,TqK9842="KHk"($2276-08-08T12:23:46.604+00:00$,0,217196983r1746962303,WWC1058=(),UGA5924=53351759r90016085,aCEimLb=142512943r74760917),uPuHA89=-2117806597r1415582225,arKMjlj=<"",$1186-09-09T12:51:48.663+00:00$,-333723828r627607813>,AAQGJL2=5657580921372982666884263904213494458),"eTWQ"(-849359362r792721457,"MUvZ"("!87081",553922344r96760699,0.0),()),{()},-1752172717r1371376991,0.0)>,<"",<642168646r777456923>,<0.0,""(|kRTp:///SaHR4|,ZZNijWV=false,AGKtO3O=<<<>,<>,""([],wodoahb=" \n\n"())>,"KX"(true,<>,GLh4645=[7],XUE607Q=0,PcCrJdY=$2020-03-06T19:28:25.705+00:00$)>,OMMTnbw={}),"krx"([],0.0,false)>,"\u2028\u205f\u2029\u0085"("Twe"(<"Ioo"(<>),-373638969r90452944,"04600"($2020-10-27T04:30:21.191+00:00$,xMjulUd=-1253995668)>)),"헚㧢\\"(-1033555227r820071014,{},-27212356r1726276821)>,<"",<-1421737561r1587074607>,<{"MYZE"([{<"8\"\'"($6819-02-22T16:34:04.937+00:00$),0.0,"ł䘚"()>,<"QV"({}),0.0,"Tb"()>}],$6729-07-05T03:26:49.387+00:00$,[],"z"(LMWIGXd=709299706r414612241,svJ3447="",VMyGD7l=([]:607784014r265776679)),nza478h=-4.676036200404)},"Rf6"(true,baZSjxl="",Pujk711=[],bOSAT51=|c:///C/bV778|,rmP1207=<|UE:///Ww/4|>),"TwJ"(true,<>)>,"zXV"(),"톲㢚"(742829857060.0919457070193544,{},true,sPWnIG9=<"",false,{""},"펪"(-8.887715998407264,([]:{"𒍆"($3057-04-18T02:53:05.163+00:00$,ZrBfZwz=<>)},[0.3721073341936343]:{"kXwW"()}),0.0),"E"()>,zEmCV3p={})>,<"QBRJjUm ",<435950082r972917377>,<2107288450r1796847113,"Vyw"(true,[]),"zy"()>,""(-2017475440,pgv618b=<>,qPL831n=$2020-12-25T02:33:52.605+00:00$,ksn2414="",KkQ5S5E={<>}),"2185"({242824191r1798804643,-1739497122r2073647033,-169795009r496865681,-492105751r641634170})>],EGmKysM=(),eEvtWgG=["83"(-7.396332887276749,<>,[-8,6.943098682959345,412804721r389350365,-963110013r148458691],-297193000r462927327),"nGD"(|fiR:///|,"4"(""),vJDUJfA=-1223735015,DAr3968=1483106557r1064335688),"AvEM"([true,false,false,true,false,true],tfLqXI1={},sdgKwH1={-1265774757r1279033076,-174774343r870714975,436117498r1330880015},bNHYlp5=<<|UBFq://tpgm/kSsg7/jh/%E3%B3%88%E4%82%95%C5%87%E3%A5%B5%C4%A8/2A|,$0319-03-17T11:52:31.103+00:00$,"ƼƗǝ䛗헵𒐱","MCfd"("YbT"((),{}),{},[]),""(<1840642583r602327912>,-2178922875037.0002352958677920,wST6472=-1851886815r24254078,iVV6dMu=|e:///aZq|(107,95))>,"  "($7015-07-22T15:36:39.189+00:00$,RBCsLsK="95",xBK2815=true,fFDi103=|icmw:///h2/9jZ|,MBy4894=$2020-02-16T07:19:46.069+00:00$,tupCJC0=<"",-58570769r1230172110,4.007459549235538>),"ssY"({},{},-112536355286238092146999481042651740261752811459117250386179681426688246299),"82T"(-3.954972644914685,<1290414479,()>),"iZ"()>,OBperdO=[{-952960504r1354988631,true,"502552"},{},{}],JIp070W={}),"RSU"(1039099822r1069252061,205718189r717764001,"Bvxp"("\t"(),"g"()),[|ANT:///GMK|(292,240),|kyBIQ://q86246|,|Ac:///1902/84/Qbnb|,|d:///WVfoR/5|,|DA:///|,|P:///8450i/%F0%A0%BC%B9%F0%92%8A%AB|],false),"93602"()],NjOgcc2=(0.0:[(),("":()),("":([[],0.0]:520395643r1165758318),"41\t\n\t\n87":()),(),(),("":([]:838752259r94891155),"@\>\>":()),("":([0.0,|JGP:///u|,"\u2029\u2028\u1680\u2000\u00a0"()]:-1651277741r2114905229,[0.0,(),1182885833r1897302377]:-143313235r1109821848),"vxDf ":())],70147634:[("𠿯𠱌𠮵ū":([0.0,$2020-07-24T00:07:15.149+00:00$,"vk"(<>,["XPL"(),"ofL"()]),{}]:807766885r1866861529,[{0},<>,-26770317r16989142,{}]:-2126255355r602345833),"\'":(),"":(),"T``4":([]:22040666r355614001)),("498315":()),(),("":([0,false]:452051233r39889659,[]:1922172563r1182431960,[-178911745r97021173,{$6219-06-16T08:30:29.300+00:00$,$5688-12-25T21:42:34.372+00:00$,$2020-09-01T02:04:37.220+00:00$},()]:7269421r103708756),"44235a":(),"dVwTNvVS":([]:-306913523r522558797,[-7,"",<"𒃉𒐰𒉟𡌂𒂰"(|w:///1490S/Nb/z765/svC|),"ƨĥƇ"(1531298983r881413309),"ELOm"({})>,0]:-507151321r358468840),"qf":()),(),("HH":(),"35":([]:-1178203142r1850837213)),()],-1309405128r345404651:[(),("":([]:-815537455r698134149,[[],|K:///riDOS/PH7|,<>]:1557865394r659169413,[0,[$2020-03-12T16:16:30.176+00:00$,$3525-11-04T21:51:23.566+00:00$],-2002398606,0.0]:-134049728r2052974329),"䣥":(),"큃䝇㽙Ą":([802966677r121742497,<<|A:///1W|(42,170,<173,416>,<417,285>),|y:///|,""()>>]:-1283521797r1318750549,[]:1276730359r521755769,[()]:873036863r1984392767),"959":(),"85507":([]:-839935532r254737125,[0,739768097r245370744,<<>,"Ehmm",-4.618667408314265>,"HsTl"()]:-146547217r226882159,[-2,7.618530081358417,1124621026r1885389935]:690995612r1463260227)),(),(),("":([]:9324593r6427358),"큪ś":([768141995r311481308,$1994-09-02T20:08:34.051+00:00$]:127100133r92773507,[<>]:-2036490448r14587805,[9.587637304956255,()]:32441180r534091437,[{"","y"}]:-1072734066r784808281),"ŋ튙㚼䀈폷피Ɔ䉜":([]:895257274r398308183,["974782"]:234834063r265775186),"hKCeVdQX":()),()],292863611r128542572:[],284466462r1640981837:[]),QsV99x4=9.20943444089502,Knk2703=()),"F9C6"(302695255r234362714,[0,0,1023363631],qXT565l={"\t\t"(|v:///|,1.7334331040160322,{},""),[<5.745536926223909,|W:///|,0.0,(1403418028:true,-2.5660263762137347:$3616-06-18T16:07:24.221+00:00$,7.669230769423994:<[true,false,true],[<0,<>>]>,0:[],1327739209r784956439:$0182-03-22T21:47:25.455+00:00$)>]},xsgJiKn=-264355821r155356418,bhptNyJ=""),"f"("K"("wnlO",true,"YE"(BqY685U=|Wivbkt:///PvJ0/%ED%82%8F/7|),{{},{|oEO:///|(150,379,<2,131>,<21,169>),|IXG:///tQYnW/r/4685v|,|Vi:///439l/ZJZ/780Y/o/PNkVu/SCyd9|,|QqGKo:///#JoiV|,|TSWzO:///x/1Eh/6871|,|uQGm:///5438/lOzf9/46/5/003/15/56n/6047|},{|DAZIa:///3/,266H/R|,|MsT:///M11g/YU957/56/tl8/1%22/QwAfD|,|YLD://Kp|}},true)),"䙮툷䥅Ł㓋"([0.2590156829589645,1686343969r165969211,-762639595r993272239,6,0,0,0,-1091416805],"",["MzeJ"(-9.841772766458076,false,2),""(<>),"OeAC"(false,<([]:{}),[""("m"(oWw7972={})),"y"(),"v"("45102"(0,(),sRs5535=$3855-03-08T23:25:29.999+00:00$),0.0),"혴퐯"(hnXdRBv=[],HKsgZBT="퐮㺻퀲㵵Ʋ䇙"),"4"(["Vfc"(),false,true],"")],"𒉥𠳘𒌛"(|crhF:///vvcSk/GFmr/%09/Nq/3458|,true,$6020-03-18T13:00:30.544+00:00$,{})>,{{},false,426295886r1848932747,|ttqT:///0|,|N:///|},false,-137183780r925794389),"f"(<<0.20770797853554668,[],false>,"FFG"(-1248089826r1727400635,"FQX"(<638540488r646678829,true>),"v"(1722190841r377769099),"\n")>,{},(),["ZV"({"\u2028\u2028\n\t\t \n","\n\t\t \t\t"},341718977r141744740,0,{}),"e"([true,true],216450908r1215802993,[()],dDd396q=|n:///3062/VkR/3j/Q/8225|,WpF7424=-191125041r163181269,JHM5025="䰴𒐞𒌪𒐋",HoF305n=""),"wtel"(828983080,|DXc:///MrXi/579|(157,481,<278,500>,<564,448>),|Ex:///|),""(|Ll:///VGl/ViAhi/2|)],<"",{$2020-09-30T09:17:52.590+00:00$},true,"Fim"("",{},(),|ZOxR://h73e/GfB|),"uVqd4"((),{[],[$2020-11-13T17:28:54.461+00:00$,$4219-09-10T22:47:17.990+00:00$,$2020-10-25T15:14:15.036+00:00$,true]},[],[]),""(-688566735r893545379,false,[],<1.2116559409876293,<[-7.621659601231913,2.4151861863214616]>>,iWpkH56="")>,EQjhl16=(<>:()),GIQttU1=1335419240r1645951211,Dza1425="WJFDS",LYo1460=[]),"tP"(-163750351r75257005,[]),"0150"(false),"uP"((<>:("Ce"():1625494235,<0.0,$2020-02-27T11:11:12.757+00:00$,[],"958"()>:0,409557204r1427971:0,({}:0):-3)),true,-0.41424201158939267,<$2020-12-02T09:49:04.550+00:00$,{},[["䱙Ń"("혀틤Ɣ䤊퇇",0),"\n"(0,{"ƀ"(Xax3085=[""],esFfiyH=-1.5720995113828262),"CUE"(|N:///bFZ/e/ib/956|)},cpEVadc=[0.4680302852505267,259997063r269139500],TDv2892=0.0),"NziV"(),"12t"()],["\u205f\u0085\n"(),"Nmk"(BrH043R=["00816"()]),"6"(),"51"(<{},1015495498r673322073>,0)],[],["DBZ"(-1463785851r1041857),"7150"(),""(4.892279694504066)]]>,|wdCLVA://73134/G|,[])],$6497-08-04T15:33:57.244+00:00$,-90902269r365334787,<{|j:///09|(53,171),|fMNGs://6|,|bPjxxFq://KWd083/mF0/SzrT/S|,|tOR:///|,|zr:///|,|iB:///d6|},"nLz"(yOD3381="iII"()),true,|S:///j|(21,77),-1011237023r896293426>)}] : list[set[node]]
	[{},{"Nfo"("",<>)},{"IiNF"(["a"("6661oxe3A",|ri:///|,202740110r1336426093,-247028709r92865034,-430344557r1742684033,NcD452J={},xBy0061=987917863r857047883,tDwV869=[-1910548003r1582095115,1265326131r1312874710,-913195469r263745436,-384035791r130936270]),"tJ"(),"r"({}),"R"(),"Q"({},hxoKvXO=[],Qte1630=[],iivAWuw=[],Fwk1372={},dRC5208=("":(1719479274r1440941435:0,1800655545r630275447:-823088611,-1067360729r1687582977:0),"\u2028\u2000":()))],[|kLh:///47/196|],-191987891r145349935,(():"",(|pAR://K/0MW39/18889|:(0.0:-776577867,0.08347395169605365:175981478,-3.5633663671893356:7,1.7217743661405005:-5),|EAc://hDyPS/wgZd/lTvQ|:(0.0:0),|JJVz:///8/WqxI|:(0.0:162541429,7.901791311415369:9),|oHR:///788A/4702/nn93/JYd/597/11/z|(119,335):(0.0:0),|kAH:///33|:(0.5403119150760305:0,-0.8700610119297923:0,9.78686363479314:0),|pfu:///1|:()):"8",(|HS:///|:(),|ex:///|:(0.0:1684608726)):"",(|EHNeD:///g|:(),|K://6Jqr/05|:(0.0:0,-0.29991044572461045:0),|VRC:///32|:(0.0:-8,-4.939366259983949:28916630),|wOqjfh:///rJz/OH836|:(0.0:524778707,3.780472220421278:1,-946381288881.5007364722332448:795444148,5.53764213930085:774420385),|dCrcp://jNPi/7/6NNXF/1|:(0.0:2,7.233804284709154:0,-0.13781656282216392:6),|RBuDvj:///9|:(0.0:2,0.024768580465314827:1)):"䕉푿㭡Ĭǖ퐁퓨퐣"),{},4,1552654073r1998872207,0),"pspv"(|FwgAnxAM:///RKRd/30A/D460|,{true,false},0,[],-5.962501210103618,true,[]),"3"([[]],1697894413r1278849571,{},"","gW"(-3,"n"(false,"",[(0.0:-3,"J"([$2020-11-16T14:30:25.272+00:00$]):9,30751365r18303886:0,<"\'3"(<52477927r168164542,"138i">,|K://TSeMa/1/TN1|),false>:0,-11884529r769620:-6),(),(),(true:0,0:0),({<[<|c:///O/F/w4/1/FiN3/ES/2BJC/31/1R/284/XkM|,"QSZ"()>],"TLA"(false,YeKoME5=$3284-12-08T19:57:28.077+00:00$,sFEifhp=<[]>,pHWqbJt=0),"Ǫ㳬㟿𠟻𒃬"()>}:0,33068395376481050729449512072707616547274463562493117840:0),((-8:"",0:"mO"):0,<0,[]>:7,|C://tOkDe/4|:0,|Aii://kv|:-382966261,{1093097644,0,-1306437088}:-2)],$1062-08-11T00:30:35.837+00:00$,"rCUX"(<80114943r1636628063,true,149837406r378290243,|ZUz:///|,["6"(<|o:///+%C2%AA/U5/3835/9|,-2059490408r428568151>,[],ecJ9251=[272106712r921337507],VYh9Tr5=2),"14600"([886787656r29372797]),"𠝱𠛅𠩃𠔌"(),"Dp"(<>)]>,"Auf"(343652689r596763499,{true},{},"kH"),{<[$5265-07-21T16:21:58.900+00:00$,$2338-02-01T02:08:46.109+00:00$,$2020-05-16T17:37:33.070+00:00$,$2020-02-16T12:04:42.604+00:00$],<"750"([],EaK625V=-5,KXZ2712={[]})>,"e"()>},0,SOc1171=0,Xla9342=|MVdx:///s/38553|(270,329),Uec7173=$1833-03-08T03:55:56.120+00:00$,WNV8335=<0.831862718179891,$2020-03-30T06:04:06.242+00:00$,(<"퀓nj㤓햅䱮"()>:"nSMS"(),"zun"():"r"({},true)),"헰㱄ƞ"(HkI6369=(),ogp6181=[{{""}},{{}},{}],vhZoNLz=(|j:///|:$1592-04-20T21:05:33.152+00:00$,|wC:///4|:$6996-03-03T16:10:42.180+00:00$)),"TBgt"(-2067503r1059612,"ec"({476814491r1780513961}),<<>,{(),{$4755-09-11T17:44:31.891+00:00$,$0191-08-05T10:11:07.801+00:00$}},"06"()>,bDdb577=0)>),-1,enc3724=<true,-217503583,0.0,|CYhsL:///|,false>,DIpU778=<{{5,-2,-492360181}},{{},{"䂹䰊𠖩𒁵𠎵"([<"18049"(),0.0>,<"WU"($2020-07-03T16:52:32.250+00:00$),0.0>],|Mw:///|,$2985-04-23T13:16:44.751+00:00$,"𒈠𒀗𒆵"([],"X"(),"FqT"({$0346-07-30T03:27:49.626+00:00$},()))),"T"((false:[]),-725651463r1681327232,0.0,false),"An"(yTxpk70=(),EHRiMxZ=true,Brp9990=493451195r200157218,rEP5133="FaWaZ"({$2224-05-02T10:22:56.524+00:00$}),eWV558N=[])},{"sOVqz"(),"\u2000\u2000\u2029\u1680\u1680"()},{"SrTD"($1080-07-23T12:51:03.593+00:00$,0.0,8),"tTB"("Ǹŵ䳖ř䐧폘Ď")}},"CFkWA"(0,{$2020-12-22T15:31:00.012+00:00$,$2020-11-19T13:52:28.461+00:00$},$1625-08-09T08:43:55.802+00:00$),"\"\'"([[],[{0.0}],[{}]],0,<(),|Cn://WsQ/%E4%A4%A9%E4%94%91|,"jDbw"(-68337824r91388965,{{},{"","DeYXo"}},WpsWNGY=[],ncso153=({}:"RnTq"()),aDu0607=""()),"OxT"(911677883r1944673990,"𒇔𠵕")>,|jrK:///t0/0OEdz?QIiM=dRS|,Czq90NI=[],ebEPkl8=8.035292717751872)>,BBR4861=<{},false,[]>,fNY0148=-9,bxtFNXj=0.14861629091114636,WOt67PN=[])),|ewaJ:///f/96508/S5s/84M/w|(388,288,<106,439>,<191,123>),|htQkEaMg://154Ig/h8/6/83n8/yG|),"l"(0,[],$2020-10-14T10:27:54.668+00:00$,0.0),"㓇䯖𒀃𒂢"([($2279-06-06T14:18:54.167+00:00$:{},$3097-03-27T08:49:21.585+00:00$:"",$1453-04-07T18:18:51.180+00:00$:"buk"(IRT2690=-23099895224578065291348158257607145409,mBZ1717={},ilN2859=[]),$3162-01-20T03:54:44.333+00:00$:3.3989877119481458,$4471-01-21T11:03:28.694+00:00$:|kJcJxw:///351xr|,$2017-03-25T11:46:34.701+00:00$:<"31097">),(),($6864-02-06T17:42:17.887+00:00$:(),$2020-12-02T22:17:57.160+00:00$:0,$3807-11-12T00:04:15.400+00:00$:"HCgO"),($0962-12-17T14:56:28.855+00:00$:<-1619258518,<[],[],<"7094"([],"66936"("gkk"())),"qyFo"($5526-07-12T02:44:51.032+00:00$)>,"kj"(|pIJ:///6a/eY|),"jVtS"(),"MwvZ"({592005765r1080883724},{},false)>,"\n\t\t \t"(true,{},<>,WJx5676=<5>,MGZ0975=<>,QJhYV21={},XDfYXpd={"033\a03"(0.0,true)},xEx91yR=$1688-08-27T10:05:15.751+00:00$),"¬\a07¥\t"(<|p:///IJqX/5d8/UX|,[0,0]>,1,-2)>,$3950-05-27T23:50:58.592+00:00$:-5,$6440-10-11T19:49:23.110+00:00$:<0,"5467",[]>,$2020-08-22T04:55:33.618+00:00$:"Dwy8"),(),($6695-10-25T11:42:02.353+00:00$:0),($0385-11-27T11:50:37.063+00:00$:false,$1406-12-21T05:37:43.091+00:00$:true)],{}),"sFrB"((),0," \t\t\t"($4692-06-26T19:27:02.611+00:00$,true,[$1791-02-17T03:50:17.804+00:00$,$6105-04-18T06:22:11.506+00:00$,$2020-06-21T15:23:49.029+00:00$],[],"",AUe0jRJ=<{},$0569-01-24T01:07:56.949+00:00$,|edni:///uQ162|>,ujf738r={},qpk2374=false,yPJ2tQg=|f:///|,vKh2576={},inD631n=false,beH7493={{},{$5054-04-10T00:32:57.914+00:00$},{$6477-01-13T13:57:14.640+00:00$,$2020-10-09T04:38:57.451+00:00$,$3608-11-26T18:24:01.551+00:00$,$3770-08-09T05:47:05.653+00:00$},{$3108-03-16T05:29:55.845+00:00$,$2020-11-25T13:02:36.223+00:00$}}))},{},{},{"\a07¨%&\""(|iDbNTrt:///|,""(-2,|NWK:///y9|,$4456-07-05T16:28:08.372+00:00$,0.0,$4245-10-21T14:22:48.780+00:00$,{}),|WrZlgCZP:///7q2/z/ws|),"64803"([],|tiHIu:///HAot|,"hlB"(0,{},<0.0>,-0.7840689014253521),|RNYB:///|,-188185557r276723745,<<-4.957961182272442,[[],[],[],[],[<|kHj:///9l2/22|,"Ě탷훭ǀĆ"()>,<|Sn:///|,"\n\t\u205f\t"({},<"YXsv"(),-2000132702r1456528919>,gdu28fj=[])>,<|Kf://uD/B314n/oaX|(88,423,<22,380>,<172,413>),"m5"($5938-05-03T01:50:56.273+00:00$,IPUdK2J=$0543-03-08T16:13:01.424+00:00$,IDLOoAK=(),qygDpTh={""("킇ż𠰄㓌ģ"()),"uOdI"([|l:///|])})>,<|cqk:///l8OIH|,"㤛텧"($2020-11-28T10:16:48.323+00:00$)>,<|V://kDfu4/46/%20VP|,"\t\t\t\n\t"()>],[]],"`\\\<\<\>"(iqUyIhm="\t\n\t"(-571467697,{[]},"\<@\<"("`"(<696060095r1916230653,"햡㭜퀑햁"()>,{$2020-03-15T23:55:36.622+00:00$},BKxib03=0),muH7499={}),[]),HHb254T=0.0,Clv903u="53",dAE8403="\>y"(true,[],"8345B",yeG0624=false,fwo9147=<["𒄯"()],"MxUoJ"(UVI2545=<0.0>),<>,"MXl13"($2020-08-08T08:14:41.235+00:00$)>,qzk9179=-1030920077r1020028583,yBG4378=true),hRk935i=<<false,"","Cce"($4311-01-15T04:35:22.022+00:00$),"ćʼnlj폫풀"()>>,MVeenlx="Keq"(<{},{"oPi"(),"𒁤𠽝𠘋𡄒"()},"\"\<\\`\\"("",[]),"uWc"([[]],[])>,<-1140768503r1241276226,[[],[[],["lDR"()]]],"QQ"([],"3"()),"3"(-1775660175r350276438)>,|g://8/FH38|,[""(),"Wn"(BHl1638=|tE:///6/kERzD/492/772DU/3|,UudXh97=|u:///|,aim9281=-0.6220176717487477)],fgScGJt="",DnD38LQ={},zBjWByV=[($2020-01-04T03:08:39.462+00:00$:"d"(QGnPBRO=$0164-04-11T14:27:26.726+00:00$,asV8804={}),$2150-01-11T03:19:19.066+00:00$:"HJWT"(false),$0671-05-04T08:09:14.723+00:00$:"P"($0759-09-02T01:01:22.698+00:00$)),(),()],pfO212W=0)),"LJĽ"([<>,<>,<>,<>,<>],698750815,{},|JRalR://oP0p/othbT/ail|,$0394-08-12T06:56:46.742+00:00$)>,$2503-01-12T10:17:11.074+00:00$,<>,[],-7.922073961180347,"yGu"({},<"bZzC"(-332397709r662042650,"909734",-848095250r234890557,fojSgZG=585825125r258776301,IMh3735=true,CsQnzP2=3,ruc07f3=29913931017.109828929082318164,njcCjh6=0),{},true,$2020-05-04T16:07:57.322+00:00$,"\u3000 \t\t"({[]},$1832-04-15T21:32:27.384+00:00$,FzADrAM={},kbrUJZR=$5705-10-18T15:28:04.481+00:00$,HkawpcY=<0.0,891316169r253030105,"𒄸𠙚㑹㔯퀴"(<>,{}),"Xs"(("5"(mkdwigN="SjF"()):"nx"(NQc36x5="X"()),"\t4\n"():"VSF"()))>,kQtNiBq=0,bfdV042=0.0),""(<(9:"LNO"(<{}>),-260763765:"㤉홓푈큚䲨"(|D:///1p7/759/E5C/4/p/9UFrz|),0:"aN\n\t"(<>)),"Kjjo"({},[],Xzwq072=<2128200853r110327574>,lmQ21kV=$2020-02-19T21:53:51.682+00:00$),"ǀ퐇통䗄"(IZpGEm7=()),"wF"(CSiuNOC=0,hwg414N=0)>,|NPR:///H49|,"mbI"("",[7.73866141632894,1.2571591373885616],<<>>),true)>,2.6541957930138507),"xx"(bKk1661=([{},{},{9,2,0},{4,0},{}]:{},[]:{},[{}]:{},[{},{},{},{}]:{}),LbQQS28=$2020-09-30T22:34:55.699+00:00$,EFp8400=false,bzMRg19=-400516909r173298731,RvL9362={},SPk0966=<>,mXCcQWh=())>),""(<{<630045147r59609300,404656945r835636892,"Q"({0},(),[163129780r446713659],{},{}),"si"(NIQ3mC6="C"([],""),yrQ43oF=(38196811r6557822:92148647r50300440,-170317281r191768188:-940906436r565024473,576298337r617467013:-371537411r1483809441,48325007r127630381:-2119074317r1699772074,933582467r784620399:-266517874r700488321),eKC33FZ="322"($0158-09-07T18:02:27.995+00:00$,<>,|t:///tk|),Jlr7957=[],VOc1bjI=false,uTB9731=-0.3806121426528689),"bCOi"(0.0),"\'\\`\"@"(|Oa:///Eb0/9vZ06/3FNW9/qhh3/12|,tUJ437f=0.0,XEA5835=$6507-05-11T12:41:28.825+00:00$,HqE149x={|w:///0845/rjefB|,|Gugrd://Ld956|},HfJMvf0=0)>,<0.0,1358171614r913725993,"iXTt"((false:0),-997941044r465129267,{},VOVbN06=<>,KCUBjxJ=$4869-09-21T22:05:38.632+00:00$,kmO603J=$2020-09-28T20:35:40.512+00:00$),"\t"(),"kpLqp"((),10664284r325983239,9.38098033715299)," \tcNC"(<[],0.0>)>,<|bsNZzt:///|,-437056454r266430083,""(0,<"CxM"(-2106157403,-4.303908324901805,{0.0,-2944766519214.8773634979268968,3.2055194434496714}),""(FJg3464="LTv"(-1308061101r67660700,[-129433566r2073875239],azu0005=288532802,GKii4p4=""(true)),vVRB369=-344688306r15077513,MEc479u=-690079647r77612281,tLs3089=false),0>,1748134373r97366442,roz5989=0.3043462660978582,ATStk5q="016"($0838-02-20T22:33:04.904+00:00$,[{}],"",()),uOghrfC=|V:///eRc/0/Hkqs|),"t"(""),"2"([],{},|MQk://z26690/36q/u4269/2o|,{},cCaCnBw=-1760543726,WoA665y=-311137003r145390591,WwBWfT3=1873744523r327682360,SWO77bj=0.0,nai2253="¦\t§"),"9"(128338925r14029568,[],[[<0.0>],[],[],[<0.0>,<1.9811041373754712>,<0.0>,<6.010061989506205>],[<0.0>]],cQy729l=[],RLk765a=false)>,<0,426964477r132322739,"j"($4460-01-02T02:51:10.733+00:00$,-1893629275r214010198,|gTXS:///|,173314714r165599609),""(<>,false,(),{},()),"7duE"(<<"D"(-2135649193r501833176,[]),"su"(<>),"ǩ𠮥"({},{(),(true:""())}),"B"({{("iwWW"():"9YP"(),"YQ"(IlR4494="Q"()):"9"(DSk0622="HUD"()))}},{},VvVEoXz=<>),"\u2029\u00a0\u205f\u0085\n"(132486115r924997791,<>)>,"cCPk"(<"Jj"(),["80"()]>),"vXNw"([]),""(<"",$2020-10-12T18:14:18.523+00:00$>,$3170-05-09T21:41:04.191+00:00$,true),"21U"($1520-07-27T11:35:37.889+00:00$)>),"㺜팎Ő"({<{},"d "({"","Uz"}),"\t\n"(|buG://V59d/PfX/173/Gx0|,true,|l:///TnCdB/Nh/gIx/341B|),"𒈋𠲠𡃺𒅨𡇗"(-8,XFDAs43=<>,sJa0Dfp=()),"jaX"()>,<{[]},"jI"(|C:///hh|,|fDK://7960|,HyX3256=["W\a00"(rsU6AWw=<"Q"()>),""(),"\t99"(0.0)],KsjAZaN=<[],{},"dvub"([])>,QKVYCk8=(),IZgW13Y=<(),true>),"MDt"(""(),[]),"D"("",{|MDg:///UNvK/5622|,|P:///6057/wa/33|,|q:///Vu/LW/CKGB/34730/y/6/2/MfCfo/T10/hy/6746/rVZ/Qtwh/mNlFV/n96|},|Qh:///F/8e3/I|),"PVy"()>,<{},"lK"(),"XuKp"([],-453308859r779874673,{}),"\"\>\<@\>"(),"z"(1054610268,oiW3971=$2020-11-18T21:06:28.501+00:00$)>},[$4245-02-23T05:49:12.306+00:00$],0,[{"",["䏤䬞Ǖ䳟䝎䇫",""],$0125-12-16T13:23:20.644+00:00$,({}:"MDca"(sFg0pVE=[{"l"()},{"TiJd"()}]))},[$2020-02-26T04:02:07.928+00:00$,$6206-04-22T10:09:00.023+00:00$],0],<[]>)>,<{<({}:["㯃훣폮ǟƴ"()]),[]>,<$2020-02-12T10:01:28.475+00:00$,[]>,<<$5421-01-18T14:10:12.591+00:00$,[<>,<>,<>]>,[0.0,-3,0,-206234088,0.0]>,<-519690729r1614353414,[0.0]>,<[],[1613846943r1995723152,0,-6.565210862087189]>,<[],[-0.07802516195981768,-0.49146357567563437,0.0,-2032806529r941481412]>},350990207r409685253,"43"(-2015095193r1234418984,|eJh://076P9/1406|,[0,4.2536420425371935,0,-2.8316220578556637,8]),"SHv\t6"(),"7\t "(|Ey:///4/%E2%80%A8%C2%A0%E3%80%80%09/96e4|,<{},$0928-09-25T15:27:16.802+00:00$,7>,[],<{[-0.8878865616910192]},"IWUj"(6.241300337584793,|anR:///|,$3433-04-26T14:37:33.925+00:00$),"No"(<$2020-09-11T12:35:54.406+00:00$,3.360763272501166,"\>"(0)>,$2020-10-07T08:20:28.642+00:00$,$1672-03-12T01:33:56.034+00:00$)>,EwXgH73=(),pve1985=0.0,NDyyMD8=$6316-08-17T08:26:33.501+00:00$,MsCwVcZ="7KiK"({},"ivO"(<>),<{},{}>,ibMzBak={})),"2"()>,<0,-2123872314r1407764249,""(1.4405471323663577,"",pAC762D="87"(91375533r388437086,<(),""(3,pxI3878=1111241422,PEJ395b={})>,<>,0.0),Rgg7784=1855686655r427610484,bsUa9tI=-1,mRiwEnO=false,cdQG09u={(),([]:(),[-1001781839r783775822,1761461083r687990569]:(0.0:"a"()))},jnn747h=$5055-05-03T20:21:31.675+00:00$),"\<"("",$2020-09-02T20:23:13.530+00:00$,false),""(|ggZT://sVG/GUH3|,{})," \n\t \t"(0,["RQ"(),""(zYMbUAI=()),"%ª#\a06"(),"㲛㪏"(),"ar"($2020-01-06T14:04:20.055+00:00$)],{$2020-09-07T20:14:47.808+00:00$,$2020-07-19T06:13:05.624+00:00$})>,<{},-236036058r692639729,"\'\a03¢©l"($6028-06-26T01:32:50.684+00:00$,RFy5880=(),WynsMjE=[],zYzpVU6=181990023r17026897,VoP18Qy=[],lLI475r=$6167-06-26T23:00:50.358+00:00$),"E"($1223-12-26T08:23:36.373+00:00$,true,-9.285576977685137),"㲂䋾Ǻ푵𠝟"($2067-05-05T22:30:44.970+00:00$,[|C://4804l|,|xjv:///?i=4099&DsKs=iN7I&J=7&bWkJ=U|],{}),"mvF"({{{""},{"","퉨Ķ㾅폒䱀틝Ÿ"}}},|rKFLa:///|,$3648-05-13T11:36:42.404+00:00$,78340901r1640563220,["pcmJ","","","",""])>},"JBT"("",{})>,$0798-01-15T08:03:37.897+00:00$),"K"(-1825029270r1011514069,{},<<{},0.0>,false,|aGFLW:///464|,"54152"({},Cveapxi=""),|yOFekv:///wbo8/g6/AnTg|>,|tWhPW:///byRxt/SKFKl/25W/107/8|,[|fJh:///|,|x://Aj/M0|,|gw:///|,|VSTx:///684/kSJ/I|,|mZAi:///|,|hQg:///Biv/eO/ew|,|De:///|],<|C:///WT609/cYFb|,{[]},{[],["Sx"(<(),""()>,{}),"ynY"(6.595575871573368,[]),"ZU"(0.0)," \t\t\t\u3000"(true,"ƍ䫔㭸𒆈𒇥",true,0.0,|Bt://1/79/s4O|)],["2228P"(-684578588r80281413,[|I:///7F|,|MVCl:///|,|e://SkC200/FF16/8049|(75,128),|KiT:///|,|uv:///|]),"e"(("yh88552":<(""():"T"([]),"ZzZ"(|U://sTzo/%C2%A0%E1%9A%80%C2%85%09/UCk/es/vc/92C/LnV|,Zcu43Lk=<>,RoXPzKP=0.0):"rfD"(),"Eu"(["S"()]):""([()])),"7217"({},qtK9QEP=$6371-06-25T12:41:08.902+00:00$,xUtFIUZ=|PV://uAG/Heh|),"nkMZ"([["c"()]]),"NegJ"("f"())>,"@펮qj":<("䲒펝Ǖ"(-0.5704154767518133,HXZ1034=["Jl"()]):"oP"(),"77490"([]):"𒂇䓃햶䖧"(-715986497r631455491)),"\u1680\u2000\u2028\u1680"(-854784426r763226825,true),"SRb"(<"픞"()," \n"()>,-254270968r950783181,yxM67a7="",JYgpyPw={},Jargawu=({}:"x"(LZsvs51=""()))),""()>,"𠀁𠭭펽㺿":<(),"001"([],<"">),"frL\'\""(tQV8296="05j",zeRgqT5=()),"mfDJ"()>,"\>":<("jzjp"(<>,jrlBK06=$2819-01-07T14:49:51.425+00:00$,Klt8815=$1980-06-22T11:07:33.101+00:00$):"¡&"(("\u2000"():"PMQ"())),"툄"():"kb"()),"mk"({0.0},$3075-07-02T11:02:52.117+00:00$),"`"([]),"cyOo\a03"("\n \n"(488942450r795215031),-189566893r111294662)>))],["퐎şƜ"([],<{{},{<0.0,"\t23"($2020-08-26T07:56:25.961+00:00$,0.0),"Yy"(XvW433B=|K://b|,wjtVH01=true,PuQ0948=-3.8718690944594867),"06421"({{}},-1340367360)>,<2.051491486666359,"47"(),"Gqw1x"({""}),"-$㓷㛝"(<>,("Vzmy"():"\t"()))>,<0.2605708599294486,"77234"((<"">:"VVUI"())),"H"(TxzDCyU=(():"QzmQ"(tEUzbNn="455"()),("sTv"():"퓡dz"()):""())),"vtq"()>},{<1.4679672957588241,"vug"(),""(),"yhx"()>},{<0.0,"LnC"(),"HNiv"(<>,-73894850r537322891),"dbt82"({(|G:///|:"HtUf"(),|Q:///9|(238,79):""())},{-77591626r36173131})>,<-0.40171440349814047,"lmMP"($2020-06-13T20:56:06.010+00:00$,0),"B4"(<{"JO"()}>,[{"폤䏟"()}]),""("EM"(),$5676-12-13T18:38:25.143+00:00$)>,<0.0,""(-690709139r509393520,3.6575126946515857),"䰸트䢖"(fPh4227="nfZ"(0.9947389104512592),JcQa1y5=1422932273r1815446021,GiskCtj=-41648982r110111215),"a1"("",{{},{[],1.5018086962506738}},cZt2ydu={})>,<-9.653387189720119,"w"(false),"SU"(<0,41651116r1692726329>,hpj4489=""),"6"({<>},false)>}},(),"ddd"(""(),[])," ZY툞"("",1117085757r1956003938,"")>,<0.0,false,"404856",<"ZEg"(),"폒㴆훧"("",-1928789424004188683771915857635379509),"g"(true,$4798-06-20T22:30:35.659+00:00$),"mZp"({},YaE0953=(),Scj0072=5.435250674873898),"zRW"()>>,<{0.0,3.3622939335167903,0.5298618852274211}>),"\u2000\n"(<()>,-1746421823r1171970936,false,qvacBh8=true,lWz0132=1659357624,nHMkyfX="OgiV"(<>,[{},{}],true,|NRdW:///NpDr7|),rORaP1L=|ICmf:///70|,PuvlJNd=[],EoXWpFd=$3720-09-04T08:56:43.599+00:00$),""(104181019r1040572601,<$0972-10-16T00:39:28.241+00:00$>,Yuv141v=|LEceS://Uzxouo/Vqw76/vm/7941/68/4V/td9/9/L|,Jqw2jkS=<true,"",361383115,[],"56385"(|w:///863|,"G"(),"핻㚞ĕ픠",pym1456=[])>,YHjWC2C=$2310-03-22T22:06:30.233+00:00$),"a"((),|xM://7/9a#5|,KMt0050="",vlt0181="",bviVUpa=<>,rCR7fCx=0),""([],<"","12D">,-4.508906330890756,<"",0>,CGayn0c=1764337793,VhybCj8="Yb"(7,310809099r1066835612,$6007-06-28T06:56:16.874+00:00$),Zlh310T=0,OKt2101=608728105r624638044),""(<>,|fz:///|,HLJ7485=0.24139708728375442,pGZl251=({"\u2000\u2028\u0085\t\t"}:()),SBR8827={},RwR9302="95mV",lZIGweq="𒈼𒅷𡐞𠓄"())]}>),"PnCo"(false,false,"𒍢𒊌𡒢𡎶nj"(1.320930939223639,0.0),44656487r1731159073)},{""(),"81h"("","",5,{""([{},{0.0},{4.957651616209526,-716923027r149049865},{}]),"lA"(|O:///i/9|,["51"($2020-01-03T10:52:58.308+00:00$,0.0),"CI"({},548722049,|XcuN:///G/3m/xx7|,""),"M"((),true,<>,"",false),"L"($0178-02-26T07:21:52.831+00:00$,621261903r1581794500,<|XO:///5BM/Kxo|,[]>,true,0.0)],|cX:///|),""(|aJ:///EUM/nL28/EaC/w/lYnG|,<{|Yun:///191f|},-473652456r101160997,$2020-04-20T12:20:21.021+00:00$,<520083610r518173371>,"ĝ폐䳯"(dgE5331={"","Ƃ䖠䭀"}),"OIq"(({}:"781"(),{<"\t\t"(),""(),"J"()>}:"틢ŝ횠"(),{<"Tfk5u"(),"\n\t\t"("JbJ"(()),-1026058439r1376380591),"nYr"()>,<"73"(),"dY"({}),"fIA"()>,<"𡁸𡆫𒐁𒑛𠜕"({},""(0.0,bdP0fTp=<>,wYOZIGw=(():"횄횥"()))),"¨)VK"(<|s:///|,(""():"dH"())>,1257174723r2070251749),"jClp"("P"({}))>,<"4g"({},<0>),"풿䱝퉻㻢"(JIxGLnh=|R:///|),"l"(LZP7523=0.0,ZeNf61V=|I://1496/LNm/6/pFX6/73875/pcQx/gs0/709gV/540/sCRN/hVWX/H/dGy/39/z/Khmoo/J6/9h/0/zk/53/If|,Hxq5054=[])>}:""([],$4528-09-09T17:33:41.243+00:00$,0),{<"V"(),"u"(),"Zhf"(537324861,aEH5332=[-8.433059675883424,-8.167465993004047],ydKeiz1=703594279r758090107)>,<"575"(<>),"hWsE"($2020-08-11T06:01:28.027+00:00$,HRrGD53=<0.0>),"K7"()>,<"\>"([],{}),"68823"(1366834106r143263173),"IKykh"()>}:"vAO"({|M://11643|,|v:///|,|A:///6224/Xm856/905/S|},true,true)),<[],$5980-12-02T23:01:32.190+00:00$,0.0,[],"qFcq"(|BKy:///19627/03|(191,116,<415,490>,<789,438>),[])>,<|iAOz:///0/bMHjh|,$2020-05-08T04:50:22.731+00:00$,{-414788258r193777943,1111257008r2030080665,-1155823666r1501727283,-241910713r506303255}>,-0.9720940549371769,<>),"\t "([{$3415-05-18T02:21:08.599+00:00$},{$4049-12-28T04:53:12.866+00:00$,$2892-11-29T18:41:05.650+00:00$,$6418-12-23T15:31:01.954+00:00$},{$3056-12-06T07:59:52.251+00:00$,$2020-02-17T05:53:03.091+00:00$,$3824-08-17T08:26:08.121+00:00$,$2065-04-06T00:31:43.365+00:00$}],{})>,8,"ZPpfYoeVB",167937983r378439828,1069031154r106189417),"3"(-1771202133r364194611,[],8),""($1782-04-18T22:57:46.037+00:00$,$0838-04-26T11:55:11.497+00:00$,0,$0812-10-29T12:08:10.307+00:00$,-1463433171r1706862047,"VyRE"(0,{<>},"9320D"(),|RTL://WtR|,125793223r130245618),{}),"263NI"(0,0.0,<"㚮䥗䟕Ź펄튥",[{{}},{},{{},{{},{"","햛햁푢톎헟ƴ","099560"}},{{},{"\n\t\t\t\n\u1680"}}},{},{{{},{"","펡","N"}},{{"","vZW755"},{"","\n"},{"","415@56Zb"}},{},{{""}}}],{"","\t\n\t\n\t\t\t\n","펼ǖ텸㲎㽭䀣䀹","oJx"},"2T"(),"XG"({},0),"R"("y",-42651217r16562018,$6872-01-22T20:30:23.455+00:00$,<-5895122859472173498776623435784465114714308110374652484067753941651514354327722612974682968784,0.0,8.863085555032491,0>),"oMxEY"(7.864182824654805)>,true,true,[])},{{},{0.0}},<{}>),"j"("\u0085\t",1962851909,qCnh05Q=-242618684r1186397409,SyS3871={},SQPv9nj=[<"3bDZuTH",<-1218289674r1503198253>,<-1676593105r1938498543,"gj"([]),"443T"(false,-443923691r1425214357,<$2020-06-10T12:02:14.177+00:00$,|oua:///916d|>,153797478r104154787)>,"턶ƫ㺡"(eEFbUoV=-1633797809r135782911,hKH4754="",EXCS71H=<>),"p"("P"(-826150747,{},1350979325r1269230564,TqK9842="KHk"($2276-08-08T12:23:46.604+00:00$,0,217196983r1746962303,WWC1058=(),UGA5924=53351759r90016085,aCEimLb=142512943r74760917),uPuHA89=-2117806597r1415582225,arKMjlj=<"",$1186-09-09T12:51:48.663+00:00$,-333723828r627607813>,AAQGJL2=5657580921372982666884263904213494458),"eTWQ"(-849359362r792721457,"MUvZ"("!87081",553922344r96760699,0.0),()),{()},-1752172717r1371376991,0.0)>,<"",<642168646r777456923>,<0.0,""(|kRTp:///SaHR4|,ZZNijWV=false,AGKtO3O=<<<>,<>,""([],wodoahb=" \n\n"())>,"KX"(true,<>,GLh4645=[7],XUE607Q=0,PcCrJdY=$2020-03-06T19:28:25.705+00:00$)>,OMMTnbw={}),"krx"([],0.0,false)>,"\u2028\u205f\u2029\u0085"("Twe"(<"Ioo"(<>),-373638969r90452944,"04600"($2020-10-27T04:30:21.191+00:00$,xMjulUd=-1253995668)>)),"헚㧢\\"(-1033555227r820071014,{},-27212356r1726276821)>,<"",<-1421737561r1587074607>,<{"MYZE"([{<"8\"\'"($6819-02-22T16:34:04.937+00:00$),0.0,"ł䘚"()>,<"QV"({}),0.0,"Tb"()>}],$6729-07-05T03:26:49.387+00:00$,[],"z"(LMWIGXd=709299706r414612241,svJ3447="",VMyGD7l=([]:607784014r265776679)),nza478h=-4.676036200404)},"Rf6"(true,baZSjxl="",Pujk711=[],bOSAT51=|c:///C/bV778|,rmP1207=<|UE:///Ww/4|>),"TwJ"(true,<>)>,"zXV"(),"톲㢚"(742829857060.0919457070193544,{},true,sPWnIG9=<"",false,{""},"펪"(-8.887715998407264,([]:{"𒍆"($3057-04-18T02:53:05.163+00:00$,ZrBfZwz=<>)},[0.3721073341936343]:{"kXwW"()}),0.0),"E"()>,zEmCV3p={})>,<"QBRJjUm ",<435950082r972917377>,<2107288450r1796847113,"Vyw"(true,[]),"zy"()>,""(-2017475440,pgv618b=<>,qPL831n=$2020-12-25T02:33:52.605+00:00$,ksn2414="",KkQ5S5E={<>}),"2185"({242824191r1798804643,-1739497122r2073647033,-169795009r496865681,-492105751r641634170})>],EGmKysM=(),eEvtWgG=["83"(-7.396332887276749,<>,[-8,6.943098682959345,412804721r389350365,-963110013r148458691],-297193000r462927327),"nGD"(|fiR:///|,"4"(""),vJDUJfA=-1223735015,DAr3968=1483106557r1064335688),"AvEM"([true,false,false,true,false,true],tfLqXI1={},sdgKwH1={-1265774757r1279033076,-174774343r870714975,436117498r1330880015},bNHYlp5=<<|UBFq://tpgm/kSsg7/jh/%E3%B3%88%E4%82%95%C5%87%E3%A5%B5%C4%A8/2A|,$0319-03-17T11:52:31.103+00:00$,"ƼƗǝ䛗헵𒐱","MCfd"("YbT"((),{}),{},[]),""(<1840642583r602327912>,-2178922875037.0002352958677920,wST6472=-1851886815r24254078,iVV6dMu=|e:///aZq|(107,95))>,"  "($7015-07-22T15:36:39.189+00:00$,RBCsLsK="95",xBK2815=true,fFDi103=|icmw:///h2/9jZ|,MBy4894=$2020-02-16T07:19:46.069+00:00$,tupCJC0=<"",-58570769r1230172110,4.007459549235538>),"ssY"({},{},-112536355286238092146999481042651740261752811459117250386179681426688246299),"82T"(-3.954972644914685,<1290414479,()>),"iZ"()>,OBperdO=[{-952960504r1354988631,true,"502552"},{},{}],JIp070W={}),"RSU"(1039099822r1069252061,205718189r717764001,"Bvxp"("\t"(),"g"()),[|ANT:///GMK|(292,240),|kyBIQ://q86246|,|Ac:///1902/84/Qbnb|,|d:///WVfoR/5|,|DA:///|,|P:///8450i/%F0%A0%BC%B9%F0%92%8A%AB|],false),"93602"()],NjOgcc2=(0.0:[(),("":()),("":([[],0.0]:520395643r1165758318),"41\t\n\t\n87":()),(),(),("":([]:838752259r94891155),"@\>\>":()),("":([0.0,|JGP:///u|,"\u2029\u2028\u1680\u2000\u00a0"()]:-1651277741r2114905229,[0.0,(),1182885833r1897302377]:-143313235r1109821848),"vxDf ":())],70147634:[("𠿯𠱌𠮵ū":([0.0,$2020-07-24T00:07:15.149+00:00$,"vk"(<>,["XPL"(),"ofL"()]),{}]:807766885r1866861529,[{0},<>,-26770317r16989142,{}]:-2126255355r602345833),"\'":(),"":(),"T``4":([]:22040666r355614001)),("498315":()),(),("":([0,false]:452051233r39889659,[]:1922172563r1182431960,[-178911745r97021173,{$6219-06-16T08:30:29.300+00:00$,$5688-12-25T21:42:34.372+00:00$,$2020-09-01T02:04:37.220+00:00$},()]:7269421r103708756),"44235a":(),"dVwTNvVS":([]:-306913523r522558797,[-7,"",<"𒃉𒐰𒉟𡌂𒂰"(|w:///1490S/Nb/z765/svC|),"ƨĥƇ"(1531298983r881413309),"ELOm"({})>,0]:-507151321r358468840),"qf":()),(),("HH":(),"35":([]:-1178203142r1850837213)),()],-1309405128r345404651:[(),("":([]:-815537455r698134149,[[],|K:///riDOS/PH7|,<>]:1557865394r659169413,[0,[$2020-03-12T16:16:30.176+00:00$,$3525-11-04T21:51:23.566+00:00$],-2002398606,0.0]:-134049728r2052974329),"䣥":(),"큃䝇㽙Ą":([802966677r121742497,<<|A:///1W|(42,170,<173,416>,<417,285>),|y:///|,""()>>]:-1283521797r1318750549,[()]:873036863r1984392767,[]:1276730359r521755769),"959":(),"85507":([]:-839935532r254737125,[0,739768097r245370744,<<>,"Ehmm",-4.618667408314265>,"HsTl"()]:-146547217r226882159,[-2,7.618530081358417,1124621026r1885389935]:690995612r1463260227)),(),(),("":([]:9324593r6427358),"큪ś":([768141995r311481308,$1994-09-02T20:08:34.051+00:00$]:127100133r92773507,[<>]:-2036490448r14587805,[9.587637304956255,()]:32441180r534091437,[{"","y"}]:-1072734066r784808281),"ŋ튙㚼䀈폷피Ɔ䉜":([]:895257274r398308183,["974782"]:234834063r265775186),"hKCeVdQX":()),()],292863611r128542572:[],284466462r1640981837:[]),QsV99x4=9.20943444089502,Knk2703=()),"F9C6"(302695255r234362714,[0,0,1023363631],qXT565l={"\t\t"(|v:///|,1.7334331040160322,{},""),[<5.745536926223909,|W:///|,0.0,(1403418028:true,-2.5660263762137347:$3616-06-18T16:07:24.221+00:00$,7.669230769423994:<[true,false,true],[<0,<>>]>,0:[],1327739209r784956439:$0182-03-22T21:47:25.455+00:00$)>]},xsgJiKn=-264355821r155356418,bhptNyJ=""),"f"("K"("wnlO",true,"YE"(BqY685U=|Wivbkt:///PvJ0/%ED%82%8F/7|),{{},{|oEO:///|(150,379,<2,131>,<21,169>),|IXG:///tQYnW/r/4685v|,|Vi:///439l/ZJZ/780Y/o/PNkVu/SCyd9|,|QqGKo:///#JoiV|,|TSWzO:///x/1Eh/6871|,|uQGm:///5438/lOzf9/46/5/003/15/56n/6047|},{|DAZIa:///3/,266H/R|,|MsT:///M11g/YU957/56/tl8/1%22/QwAfD|,|YLD://Kp|}},true)),"䙮툷䥅Ł㓋"([0.2590156829589645,1686343969r165969211,-762639595r993272239,6,0,0,0,-1091416805],"",["MzeJ"(-9.841772766458076,false,2),""(<>),"OeAC"(false,<([]:{}),[""("m"(oWw7972={})),"y"(),"v"("45102"(0,(),sRs5535=$3855-03-08T23:25:29.999+00:00$),0.0),"혴퐯"(hnXdRBv=[],HKsgZBT="퐮㺻퀲㵵Ʋ䇙"),"4"(["Vfc"(),false,true],"")],"𒉥𠳘𒌛"(|crhF:///vvcSk/GFmr/%09/Nq/3458|,true,$6020-03-18T13:00:30.544+00:00$,{})>,{{},false,426295886r1848932747,|ttqT:///0|,|N:///|},false,-137183780r925794389),"f"(<<0.20770797853554668,[],false>,"FFG"(-1248089826r1727400635,"FQX"(<638540488r646678829,true>),"v"(1722190841r377769099),"\n")>,{},(),["ZV"({"\u2028\u2028\n\t\t \n","\n\t\t \t\t"},341718977r141744740,0,{}),"e"([true,true],216450908r1215802993,[()],dDd396q=|n:///3062/VkR/3j/Q/8225|,WpF7424=-191125041r163181269,JHM5025="䰴𒐞𒌪𒐋",HoF305n=""),"wtel"(828983080,|DXc:///MrXi/579|(157,481,<278,500>,<564,448>),|Ex:///|),""(|Ll:///VGl/ViAhi/2|)],<"",{$2020-09-30T09:17:52.590+00:00$},true,"Fim"("",{},(),|ZOxR://h73e/GfB|),"uVqd4"((),{[],[$2020-11-13T17:28:54.461+00:00$,$4219-09-10T22:47:17.990+00:00$,$2020-10-25T15:14:15.036+00:00$,true]},[],[]),""(-688566735r893545379,false,[],<1.2116559409876293,<[-7.621659601231913,2.4151861863214616]>>,iWpkH56="")>,EQjhl16=(<>:()),GIQttU1=1335419240r1645951211,Dza1425="WJFDS",LYo1460=[]),"tP"(-163750351r75257005,[]),"0150"(false),"uP"((<>:("Ce"():1625494235,<0.0,$2020-02-27T11:11:12.757+00:00$,[],"958"()>:0,409557204r1427971:0,({}:0):-3)),true,-0.41424201158939267,<$2020-12-02T09:49:04.550+00:00$,{},[["䱙Ń"("혀틤Ɣ䤊퇇",0),"\n"(0,{"ƀ"(Xax3085=[""],esFfiyH=-1.5720995113828262),"CUE"(|N:///bFZ/e/ib/956|)},cpEVadc=[0.4680302852505267,259997063r269139500],TDv2892=0.0),"NziV"(),"12t"()],["\u205f\u0085\n"(),"Nmk"(BrH043R=["00816"()]),"6"(),"51"(<{},1015495498r673322073>,0)],[],["DBZ"(-1463785851r1041857),"7150"(),""(4.892279694504066)]]>,|wdCLVA://73134/G|,[])],$6497-08-04T15:33:57.244+00:00$,-90902269r365334787,<{|j:///09|(53,171),|fMNGs://6|,|bPjxxFq://KWd083/mF0/SzrT/S|,|tOR:///|,|zr:///|,|iB:///d6|},"nLz"(yOD3381="iII"()),true,|S:///j|(21,77),-1011237023r896293426>)}]

hashCodes of ISourceLocation implementations not uniform?

The (many different) hashCode implementations of ISourceLocation simply add the hashcodes of their constituent strings.

  • find out how bad this distribution gets, and if its worth coming up with a better but more expensive computation
  • improve the computation if needed.

Add identity ("kind") to types (for the benefit of generated code and runtime system)

The Rascal compiler uses a fingerprint function on types for fast function dispatch, switch and visit. It would speed up the implementation of this function if each type in vallang had a a separate "kind", an integer (or enum) for each basic type list, set, etc. A complication are the "external" types that also need to have a kind and that kind should not interfere with the other ones.

Enums are not extensible, but here are some suggestions to circumvent that: https://www.baeldung.com/java-extending-enums.
Probably plain old ints will be the fastest.

TypeFactory use of `checkNull` shows up on profiles

/**
	 * Construct a function type with labeled parameter and keyword field types
	 */
	public Type functionType(Type returnType, Type[] argumentTypes, String[] argumentLabels, Type[] keywordParameterTypes, String[] keywordParameterLabels) {
		checkNull((Object[]) argumentTypes);
		checkNull((Object[]) argumentLabels);
		checkNull((Object[]) keywordParameterTypes);
    	checkNull((Object[]) keywordParameterLabels);
		return getFromCache(new FunctionType(returnType, 
			(TupleType) getFromCache(new TupleTypeWithFieldNames(argumentTypes, argumentLabels)), 
			(TupleType) getFromCache(new TupleTypeWithFieldNames(keywordParameterTypes, keywordParameterLabels))
		));
	}

Given our use of the checker framework, and the possibility to put this in asserts, I wonder if we can either:

  • remove all these checkNulls?
  • or, make sure they are only activated in -ea mode, using assert?

These checkNull's showed up in a profile for testing the speed of transitive closure. Due to another optimization they have since dropped off, but still it seems like this is unnecessary overhead.

binary io?

There's a IValueBinaryReader and IValueBinaryWriter, but the only implementations are in the old/ subdirectory and are marked as deprecated.

Is binary IO still supported?

Is there an easy way to deal with IO these days? Like a neat factory that can produce readers and writers for different formats?

Drop xz-java dependency

Considering recent news, we're trying to take a close peek at our dependencies, and the support behind them.

Now we actually depend on xz-java, which based on most analysis doesn't appear to have received meaningful commits from the harmful actor. And indeed, only 1 commit that changes code, and I've reviewed it, it looks fine. So I have no specific concerns with regards to xz-java in vallang.

However, I did lead me to think about, why do we have it in vallang? It's only used in the binary serializer, in a compression mode that was up until very recently not working. I don't think there exists any files that use that compression mode. Especially since there has been no release of vallang with a working EXTREME level of compression.

I think we could remove the xz-java dependency, and stop support for that extreme compression mode, without hurting any user. And throw an exception in the reader to use an older version to downgrade the file to a lower level of compresssion (which I think nobody will have ever hit).

Entry Buckets in ShareableValuesHashSet typically nest 4 or 5 times during a transitive closure on source locations (call graph)

I'm debugging a performance issue in transitive closures of large call graphs.

  • The profile shows how all of the memory and time goes to the temporary ShareableValuesHashSet that is used by the closure method of PersistentHashIndexedBinaryRelation
  • Then all the memory runs out and GC takes over
  • The heap dump shows at least 40% of the memory goes to Entry[] and Entry as held by ShareableValuesHashSet
  • At every array index in de ShareableValuesHashSet we find an Entry that has a next field to a different entry with the same hash position, which has a next field, etc. All indices I've clicked on have at least 4 nesting levels deep, some go up to 5, 6, 7, 8.

Is this low-hanging fruit @msteindorfer ? If you have some thoughts to share, I'd be listening ;-) Otherwise, I'll start experimenting a bit in the coming days and weeks.

Illegal reflective access by FileChannelDirectInputStream

This happens during a a build of rascal:

[INFO] WARNING: An illegal reflective access operation has occurred
[INFO] WARNING: Illegal reflective access by io.usethesource.vallang.io.binary.util.FileChannelDirectInputStream (file:/Users/paulklint/.m2/repository/org/rascalmpl/rascal/0.19.4-RC1/rascal-0.19.4-RC1.jar) to method java.nio.DirectByteBuffer.cleaner()
[INFO] WARNING: Please consider reporting this to the maintainers of io.usethesource.vallang.io.binary.util.FileChannelDirectInputStream
[INFO] WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
[INFO] WARNING: All illegal access operations will be denied in a future release

datetime creation methods fill in "current" timezone and offset (of the person running the current JVM)

That behavior (see subject) kills the possibility of treating datetime values as immutable facts. If the information about the timezone and the offset is unknown it should remain unknown. Now this default behavior is (literally) subjective and it is added implicitly without the user's explicit consent.

Will change this to using zulu time in case the information is missing, for lack of explicitly marking it is missing.

evaluate efficiency of new hash-consing design in pr #131

  • Pull request #131 is a carefully designed optimization of the hash-consing for Type instances.
  • We merged it
  • It still requires some empirical investigation, only to see if there are no hidden snags, because in theory this should be much faster and also more correct (thread-safe)

What is the status of `removeKey`?

The IMap interface provides a removeKey method. However, io.usethesource.vallang.impl.AbstractMap throws an UnsupportedOperationException for it.

When is an implementation of removeKey to be expected? Thanks in advance.

StandardTextReader issue with keyword fields

Caused by: java.lang.ArrayIndexOutOfBoundsException: 3
        at io.usethesource.vallang.type.TupleType.getFieldType(TupleType.java:146)
        at io.usethesource.vallang.io.StandardTextReader.readFixed(StandardTextReader.java:789)
        at io.usethesource.vallang.io.StandardTextReader.readConstructor(StandardTextReader.java:392)
        at io.usethesource.vallang.io.StandardTextReader.readValue(StandardTextReader.java:126)
        at io.usethesource.vallang.io.StandardTextReader.read(StandardTextReader.java:95)

this is a prod read from String in a generated parser. The written prod has an additional keyword field which is not declared in this context (weight=0).

remove type alias feature and labels for tuple fields at run-time.

The type alias feature is not only costly at run-time, it also prevents certain optimizations from being correct in the current implementation.

Because vallang is mainly used as a run-time for Rascal, it can do without the alias feature. The Rascal compiler offers a compile-time type alias feature which is equivalent from a programmer's perspective.

By removing type aliases, I believe the only source of type representation ambiguity at run-time will be labed fields of tuple types. Those too, can be replaced by a compile-time feature.

Source locations with offsets and lengths are not printed correctly

If you do a .toString() on a ISourceLocation that has a offset and friends, the classname is printed for example: io.usethesource.vallang.impl.primitive.SourceLocationValues$CharCharByteByteByteByte@88d03707 (this is the default Object.toString implementation) .

If you use the StandardTextWriter (like iprintln does), you do see the correct location printed.

Thanks to @andreavdh who reported this in the rascal slack channel.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.