No OneTemporary

File Metadata

Created
Sun, Feb 15, 5:13 PM
diff --git a/config/default.json b/config/default.json
index a4c45db..9ce4b3c 100644
--- a/config/default.json
+++ b/config/default.json
@@ -1,74 +1,74 @@
{
"containers": {
"id": {
"implementations": "containers_impl",
"linkedlist": "linkedlist"
},
"impl": {
"solid": "solid",
"onthefly": "onthefly"
}
},
"logging": {
"id": "logging"
},
"function-entry": "entry",
"transcend": {
"bindings" : {
"variable": "bind",
"function": "bind_func",
"scope": "bind_scope",
"function_demand" : "bind_function_demand",
"scope_decision": "bind_scope_decision"
},
"context" : {
"decisions":{
"dependent": "resolution_dependency"
}
},
"nonevalue": "nonevalue",
"ret": {
"symbol": "retv",
"tag": "ret"
}
},
"tests": {
"template": "troubleshooting",
"templates": {
- "troubleshooting":"*.Doc_*:-Latex.*",
+ "troubleshooting":"-Latex.*:*.Doc_*",
"documentation":"Modules.Doc_*:Modules_API.Doc_*:Interpretation.Doc_*:AST.Doc_*:Loop.Doc_*:LateReasoning.Doc_*:Latex.Doc_*:Polymorphs.Doc_*:Transcend.Doc_*:ASTCorrespondence.Doc_*:Virtualization.Doc_*:Exploitation.Doc_*:Communication.Doc_*:Introduction.*",
"default": "*",
"ast": "AST.*",
"effects": "Effects.*",
"basic": "Attachments.*",
"compilation": "Compilation.*",
"communication": "Communication.*",
"cfa": "CFA.*",
"containers": "Containers.*",
"dfa": "DFA.*",
"diagnostic": "Diagnostic.*",
"dsl": "Association.*:Interpretation.*",
"exploitation": "Exploitation.*",
"ExpressionSerializer": "ExpressionSerializer.*",
"externc": "InterfaceExternC.*",
"loops": "Loop.*",
"latereasoning": "LateReasoning.*",
"latex": "Latex.*",
"modules": "Modules.*",
"polymorphs": "Polymorphs.*",
"intrinsic-query": "Types.SlaveTypes*:Association.TypedQuery*",
"types": "Types.*",
"virtualization": "Virtualization.*",
"vendorsAPI/clang": "ClangAPI.*",
"vendorsAPI/xml2": "libxml2.*"
}
}
}
diff --git a/documentation/Concepts/polymorphism.xml b/documentation/Concepts/polymorphism.xml
index e757c58..ccc0819 100644
--- a/documentation/Concepts/polymorphism.xml
+++ b/documentation/Concepts/polymorphism.xml
@@ -1,229 +1,272 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter version="5.1" xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:trans="http://docbook.org/ns/transclusion"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:m="http://www.w3.org/1998/Math/MathML"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:db="http://docbook.org/ns/docbook">
<?xxe-sn 26n42fz1reo 1?>
<title><?xxe-sn 26n42fz1reo 2?>Polymorphism</title>
+ <para><?xxe-sn 2be091dx6gw 1?>See <link
+ xlink:href="/w/syntax#function-specializations"><?xxe-sn 2be091dx6gw 2?>function
+ specializations</link> for syntax.</para>
+
<para><?xxe-sn 26n42fz1reo 3?><emphasis><?xxe-sn 26n42fz1reo 4?>Polymorphism</emphasis>
- is an umbrella term to denote number of techniques across different
- programing paradigms. They all share the same intention to provide ability
- easily recombine software components in a different way with as little as
- possible manual work on developer's side. It serves two major goals:
- <emphasis><?xxe-sn 26n42fz1reo 5?>specialization</emphasis>, when software,
- initially designed to support wide range of use cases, is configured for
- concrete particular case and <emphasis><?xxe-sn 26n42fz1reo 6?>extension</emphasis>
- - adapting software to an environment and conditions it was not specifically
+ is an umbrella term to denote a number of techniques across different
+ programing paradigms. They all share the same intention to provide the
+ ability to easily recombine software components in a different way with as
+ little manual work on developer's side as possible. It serves two major
+ goals: <emphasis><?xxe-sn 26n42fz1reo 5?>specialization</emphasis>, which
+ purports that software initially designed to support a wide range of use
+ cases is being configured for a specific case, and <emphasis><?xxe-sn 26n42fz1reo 6?>extension</emphasis>
+ – adapting software to an environment and conditions it was not specifically
designed for.</para>
- <para><?xxe-sn 26n42fz1reo 7?>In course of software engineering evolution,
+ <para><?xxe-sn 26n42fz1reo 7?>In course of software engineering evolution, a
number of polymorphism techniques was proposed and experimented with, all
- suited for different use-cases. Xreate presents generalized and elegant
- approach that exhaustively covers wide landscape of polymorphism
+ suited for different use-cases. Xreate presents a generalized and elegant
+ approach that exhaustively covers the wide landscape of polymorphism
variations.</para>
<para><?xxe-sn 26n42fz1reo 8?>Polymorphism in Xreate can be applied on two
levels:</para>
<itemizedlist>
<?xxe-sn 26n42fz1reo 9?>
<listitem>
<?xxe-sn 26n42fz1reo a?>
<para><?xxe-sn 26n42fz1reo b?><emphasis><?xxe-sn 26n42fz1reo c?>Functions
- level</emphasis>. Function in Xreate can have a multiple
- <emphasis><?xxe-sn 26n42fz1reo d?>specializations</emphasis> and
+ level</emphasis>. Function in Xreate can have multiple
+ <emphasis><?xxe-sn 26n42fz1reo d?>specializations</emphasis>, and
polymorphism is compiler's ability to decide which exactly
specialization to use depending on various factors</para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo e?>
<para><?xxe-sn 26n42fz1reo f?><emphasis><?xxe-sn 26n42fz1reo g?>Modules
level</emphasis>. Multiple modules can provide the same service for
users. <link
xlink:href="/w/syntax/modules/#modules-resolution"><?xxe-sn 26n42fz1reo h?>Modules
Resolution</link> is a process to decide which exactly module to
- use</para>
+ use.</para>
+
+ <remark><?xxe-sn 26vapv2jrow pu35zrt1aby9?>По поводу Modules Resolution:
+ кажется в предыдущем файле я внес несколько исправлений, добавив
+ апостроф после Modules. По грамматическим правилам это верно, но если
+ Modules Resolution это устоявшийся термин в твоей документации, то
+ возможно лучше без апострофа.</remark>
</listitem>
</itemizedlist>
<section>
<?xxe-sn 26n42fz1reo i?>
<title><?xxe-sn 26n42fz1reo j?>Function Level Polymorphism</title>
<para><?xxe-sn 26n42fz1reo k?>Basic idea is to allow developer to define
several functions with the same name or, in other words, several
<emphasis><?xxe-sn 26n42fz1reo l?>specializations</emphasis>. Caller code
- then invokes necessary function by its shared name but can't directly
- specify particular specialization. Exact specialization to be invoked is
- decided later by decision process called <emphasis><?xxe-sn 26n42fz1reo m?>polymorphism
+ then invokes the necessary function by its shared name, but cannot specify
+ a particular specialization directly. The exact specialization to be
+ invoked is decided later by a decision process called <emphasis><?xxe-sn 26n42fz1reo m?>polymorphism
resolution</emphasis> carried out by Transcend. This indirect invocation
approach gives enough flexibility to use or replace different
specializations depending on various conditions during compile time as
well as at runtime.</para>
- <para><?xxe-sn 26n42fz1reo n?>Please refer to <link
- xlink:href="/w/syntax#function-specializations"><?xxe-sn 26n42fz1reo o?>syntax</link>
- for details about function specializations. Each specialization must have
- unique <emphasis><?xxe-sn 26n42fz1reo p?>guard</emphasis>(among all
+ <para><?xxe-sn 26n42fz1reo n?>Each specialization must have unique
+ <emphasis><?xxe-sn 26n42fz1reo p?>guard</emphasis> (among all
specializations with the same name) to be discernible from others. To
- summarize, function invocation is a two layered process, in which client
- code specifies callee function's shared name, and polymorphism resolution
- specifies specialization guard if needed.</para>
-
- <para><?xxe-sn 26n42fz1reo q?>For an example, assume that we develop
- program to operate under specified time constraints. To model
- implementation suitable for real time environment, one specialization of
- <code><?xxe-sn 26n42fz1reo r?>crucialOperation</code> is defined with
- <code><?xxe-sn 26n42fz1reo s?>env(realtime)</code> guard i.e. satisfies
- some fixed execution time constraints. Caller <code><?xxe-sn 26n42fz1reo t?>main</code>
- specifies only function name <code><?xxe-sn 26n42fz1reo u?>crucialOperation</code>
- thus delegating decision on guard to a polymorphism resolution done
- elsewhere, based on environment's constraints the code is executed
- in.</para>
+ summarize, function invocation is a two-layered process, where the client
+ code specifies the callee function's shared name, while polymorphism
+ resolution specifies specialization guard, if needed.</para>
+
+ <para><?xxe-sn 26n42fz1reo q?>For example, let us assume that we have been
+ developing a software program to operate under specified time constraints.
+ To model an implementation suitable for real time environment, one
+ specialization of <code><?xxe-sn 26n42fz1reo r?>crucialOperation</code> is
+ defined with <code><?xxe-sn 26n42fz1reo s?>env(realtime)</code> guard,
+ i.e. it satisfies some fixed execution time constraints. Caller
+ <code><?xxe-sn 26n42fz1reo t?>main</code> specifies just a function name
+ <code><?xxe-sn 26n42fz1reo u?>crucialOperation</code> thus delegating the
+ decision in respect of guard to polymorphism resolution done elsewhere,
+ based on the environment's constraints the code is executed in.</para>
<programlisting xml:id="FnLvlPoly_1"><?xxe-sn 26n42fz1reo v?>name="tests/polymorph.cpp: Polymorphs.Doc_FnLvlPoly_1"
guard:: env(realtime)
{
crucialOperation = function:: int
{ 0 }
}
main = function:: int; entry
{
crucialOperation()
} </programlisting>
</section>
<section>
<?xxe-sn 26n42fz1reo w?>
<title><?xxe-sn 26n42fz1reo x?>Polymorphism Resolution</title>
<synopsis><?xxe-sn 26n42fz1reo y?>SYNTAX:
**dfa_callguard**(//call-site-ref//, //guard//)</synopsis>
<itemizedlist>
<?xxe-sn 26n42fz1reo z?>
<listitem>
<?xxe-sn 26n42fz1reo 10?>
<para><?xxe-sn 26n42fz1reo 11?><emphasis><?xxe-sn 26n42fz1reo 12?>call-site-ref</emphasis>
reference to a call site in AST</para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo 13?>
<para><?xxe-sn 26n42fz1reo 14?><emphasis><?xxe-sn 26n42fz1reo 15?>guard</emphasis>
resolved function specialization guard</para>
</listitem>
</itemizedlist>
<para><?xxe-sn 26n42fz1reo 16?>When compiler encounters function
- invocation that has several specialization it refers to the table
+ invocation that has several specializations it refers to the table
<code><?xxe-sn 26n42fz1reo 17?>dfa_callguard</code> to find out which
- specialization to call. It must have entry with appropriate
+ specialization to call. It must have an entry with appropriate
<code><?xxe-sn 26n42fz1reo 18?>guard</code> for every invocation site
<code><?xxe-sn 26n42fz1reo 19?>call-site-ref</code> of a polymorphic
function. Polymorphism resolution is a process of filling out
- <code><?xxe-sn 26n42fz1reo 1a?>dfa_callguard</code> for a compiler based
+ <code><?xxe-sn 26n42fz1reo 1a?>dfa_callguard</code> for the compiler based
on custom Transcend rules reflecting one or another polymorphism
strategy.</para>
</section>
<section>
<?xxe-sn 26n42fz1reo 1b?>
<title><?xxe-sn 26n42fz1reo 1c?>Late Polymorphism</title>
<para><?xxe-sn 26n42fz1reo 1d?>Late Polymorphism is an extension to allow
polymorphism resolution to be based on data known only at runtime, i.e.
resolve function specializations dynamically. The Idea is to use Late
Transcend to access runtime data. See <link
xlink:href="/w/transcend/latetranscend"><?xxe-sn 26n42fz1reo 1e?>Late
Transcend</link> for details.</para>
<para><?xxe-sn 26n42fz1reo 1f?>Example below demonstrates <code><?xxe-sn 26n42fz1reo 1g?>test</code>
invoking polymorphic function <code><?xxe-sn 26n42fz1reo 1h?>compute</code>:</para>
<programlisting xml:id="LatePoly_1"><?xxe-sn 26n42fz1reo 1i?>name="tests/polymorph.cpp: Polymorphs.Doc_LatePoly_1"
Strategy = type variant {fast, precise}.
guard:: fast
{
compute = function:: int
{0}
}
guard:: precise
{
compute = function:: int
{1}
}
test = function(s:: Strategy; alias(strategy)):: int; entry
{
switch late (s):: int
{
compute():: int; guardalias(strategy)
}
}</programlisting>
<para><?xxe-sn 26n42fz1reo 1j?>Function <code><?xxe-sn 26n42fz1reo 1k?>compute</code>
has two specializations, <code><?xxe-sn 26n42fz1reo 1l?>fast</code> and
<code><?xxe-sn 26n42fz1reo 1m?>precise</code>. We see that <code><?xxe-sn 26n42fz1reo 1n?>test</code>
gets parameter <code><?xxe-sn 26n42fz1reo 1o?>s</code> that dictates exact
- strategy to use. Clearly, resolution should work dynamically to cope with
- cases like this, for value of parameter <code><?xxe-sn 26n42fz1reo 1p?>s</code>
- not only is unknown at compile time, but it can change with each
+ strategy to use. Clearly, resolution should work dynamically to deal with
+ cases like this, for not only the value of the parameter <code><?xxe-sn 26n42fz1reo 1p?>s</code>
+ is unknown at the compile time, but also it can change with each
<code><?xxe-sn 26n42fz1reo 1q?>test</code> execution.</para>
- <para><?xxe-sn 26n42fz1reo 1r?>Operation Switch Late is compiled into
- several branches, two in this case, each branch executing appropriate
- <code><?xxe-sn 26n42fz1reo 1s?>compute</code> specialization. Correct
- branch executed depending on current <code><?xxe-sn 26n42fz1reo 1t?>s</code>
+ <para><?xxe-sn 26n42fz1reo 1r?>Operation <code><?xxe-sn 2be091dx6gw 3?>switch late</code>
+ is compiled into several branches, two in this case, each branch executing
+ appropriate <code><?xxe-sn 26n42fz1reo 1s?>compute</code> specialization.
+ The correct branch is executed depending on the current <code><?xxe-sn 26n42fz1reo 1t?>s</code>
value. Custom annotations <code><?xxe-sn 26n42fz1reo 1u?>alias(Alias)</code>
- and <code><?xxe-sn 26n42fz1reo 1v?>guardalias(Alias)</code> used to assign
- an alias in order to specify which parameter to use for as basis for
- resolution</para>
+ and <code><?xxe-sn 26n42fz1reo 1v?>guardalias(Alias)</code> are used to
+ assign an alias in order to specify which parameter to use as basis for
+ resolution.</para>
</section>
<section>
<?xxe-sn 26n42fz1reo 1w?>
<title><?xxe-sn 26n42fz1reo 1x?>Auto Expansion of Late Parameters</title>
- <para><?xxe-sn 26n42fz1reo 1y?>In previous example, switch late operation
- was used to facilitate calling of polymorphic function with late
- polymorphism resolution. It's not that convenient to wrap each invocation
- by switch late whenever there is need to call late polymorphic function.
- Specifically to handle cases like this, compiler uses late parameter auto
- expansion technique.</para>
+ <para><?xxe-sn 26n42fz1reo 1y?>In the previous example, operation
+ <code><?xxe-sn 2be091dx6gw 4?>switch late</code> was used to facilitate
+ calling of a polymorphic function with late polymorphism resolution. It is
+ not that convenient to wrap each invocation using <code><?xxe-sn 2be3dypnsao 1?>switch
+ late</code> whenever we need to call a late polymorphic function. Compiler
+ uses the late parameter auto expansion technique in order to specifically
+ handle cases like this.</para>
<para><?xxe-sn 26n42fz1reo 1z?>If compiler discovers that <code><?xxe-sn 26n42fz1reo 20?>late(dfa_callguard())</code>
- entry exists for current invocation and it does not have enclosing switch
- late already, compiler automatically generates different branches that
- invoke relevant specializations and transfers control to a branch
- depending on late parameter value. In other words invocation implicitly
- wrapped into switch late instruction if needed.</para>
+ entry exists for current invocation, and it does not have enclosing
+ <code><?xxe-sn 2be091dx6gw 5?>switch late</code> already, compiler
+ automatically generates different branches that invoke relevant
+ specializations and transfers control to a branch depending on the late
+ parameter's value. In other words, invocation is implicitly wrapped into
+ <code><?xxe-sn 2be091dx6gw 6?>switch late</code> if needed.</para>
</section>
</chapter>
<?xxe-revisions
-#2 2019-02-20T12:19:58Z pgess
+#5 2019-03-07T17:53:18Z pgess
+#4 2019-03-07T17:09:57Z pgess
+1sPEAAABzxMAJM5rAAEQDVNzwgojBRMMU4Zt1VMFY4VXAMcao16ePpdskCeHIA==
+
+#3 2019-01-04T15:38:33Z Acer2
+1sPEAAABzmsAiGDYGwCCDIQFgkZQbGVhc2YgYWJzLiBhPz4iRCIgLbXQs9C40YDRg4DQtbW+0YK4
+uNC80YMg0YE/INCV0L+y0Yuy0LDRgNC40LDQs9C00LCw0LfRjCAiImE3eGd5eTVxejFzIi4uLrWM
+uNGA0Ysg0LfRgdGMIHNpYXJ5LmNhbWJyaWRnZWl1YT8+MSkgIr27vdGP0L280Yu10LSHuNGCILXR
+hSDRitC10LqFIC0sIEUsIEm1LYHQuLq4PyDQlrXRg4e7sNGFICLRh7IiuiDRjy4gMikgIkmBsLjQ
+uyy+t9Cw0LOyINCx0YPQujsgIiKz0LTQvNCzu9GOLiDQob7Rhy240Le+0Y4/INCiZSJpbmNvYXRl
+L2k/c4QIE45PQ4pOAQX4IwYTQRMLIwRDBTMUwVMXAQNTh0czCGMEEw1DY2MoAQVDF4MIAQP6QwQB
+CDMEAQNTBEMFpMGTBIMFAQFjCDMFAQEjI1MGAQcTBSMGMwUBBDMHy8EBCVMEYwYBBjMMEwWpAQRD
+KwEBQwszPXMFU4o+AQEzhjlDh3mDEgEKYyEBARMEMwTCUwQjBaSl0wEHQwQBBRME0+ABDWMFkwtD
+EIMMUw1DDEOFH3MMEwRDBWOEBnMMM4EjUwhDNnMMAQH3kwVjFCMoAQdDG3MMkwcjBbwTBQEBIwZT
+BMGy9TMFMwS3MwQjBa/z5RMEAQQTBAEGYwUBA1MJAQNTBAEDYwsjBBMEIwUjCyMEYwUjBoMFAQH8
+IwRDBSMIAQMTCAEBcwkjCZMFAQEzCwEEIwUTBKSTBAECUwUBAYMEIwQzBQEBkwYBAVMEAQYTBUME
+QwQBAhMGAQtTGnMMkweTBP8zBUMEAQGDBZMFUwQjBgEDQw5zC6/vEwSTDSMEQwuTBJMFIwSDBAEF
+EwWvMwQBByMEkwQBAzMXsdOyIwUBAjMEAQITBBMEIwQBAxMEAQQjCDME/FMEAQIzBiMEIwUBAZMG
+AQOTBiMEIxYBARMEIwcjBUMFYwaTBxMFAQJDDAEEYwozBpMFkwojCkMGAQIzCIMKAQQTBAEFEwYB
+ASMMUwtDCwCFLo5QnyKmP4QagzStfxayRJgykRuBaoJbmmyLVYUQiDKRdaeBOX6BN1Q0lGaBAsu5
+jGBmRgmVfg2IbBozUA8MF5YOlgSONyaBH5R5ikGGbwccilegeYZhi0OcE5VWlGmBRwQeBIQXCuqD
+TLSpbocwQIiHa5tuhVuIgySgN4EtiKZvOWiNLKRviCypSiOUNw0BgkKoKEKBOz+pGiCpeI14PU2V
+WZVDQ7ImmRGCBqkklWKpdlOOToEEjlq5tHdjgQOqbpRgyW0fCKtNlgWVIDwruY9XBndRlQE5HJRX
+tiWILDl3gRQxoDwHrHY9iINMw5R4eZEMTdQ+g2pWliEtX6xRgLRhUAmCMoRZgQGXMZUQTJRchFmB
+eYIRYSatHROvpIJ6hGCUZ4VQaYFnTs2XJoEGHxVWxoF3tCmBIDWIZoENrimgZqUU
+#2 2018-12-16T15:30:15Z Acer2
+1sPEAAAB2BsAgXPOcAAKgQdbY29wQydieVN0b3OxNROBBUOOYwEDUwcTBlMPQwljCjMdUw0TBFMF
+Qw4zEkNYU4FMAQFjDhMGMxBTgT9jQxMFMxZDCWMqU3FDEjMMUywzOgEBQy4BAiMNUwkTBEMFQwRj
+CFMQMwwBARMEQwgBAjMXQwtjBRMEYyNDgSVTIHMMY4ERgwRDIGMNMxdzDEMfEwtjCwCxNoEIkAWI
+B45zHIVityM0iTGtdA0SF4F9gVGkQxcUgUOIIUSBLqtxSnWHXB4uPIEkQJhGrCGIYZB9hXSBPocd
+gWQHgXDEYJpJDVOBJpwsSYEZIRCcI6tXh3Q=
#1 2018-12-12T21:49:13Z pgess
-1sPEAAAByDQAGMdHAAALB3OicBMFQ5B0U5NeAJpsiECRKg==
-
+1sPEAAABznAAggjHRwASgRVaZW4sY29uY3JlLWEnLiBFIGluc4RwE2lDCFNHYwtjIDNeAQJTCWME
+UxxDF7FTDQEGIwYzCGMEMz4BATOBLZMKQ3BjOjOCUgEBQ0gjBZMNU4NVQwxTglljJTMIAQEjBEMG
+UwlDGQEDYzZThERjeAEBMxEBAkMHQxZjH1MEkw0jCjMLUw9TBVM2MwVjB0MPEwdTPzOBS0MGU25j
+BWNWQxVTDFMnMztDpRQAhHJtC2dGC4Mmjj57HpM2I4kUkV4wHUFygTlyPoJRkBMvW2mGZoJdJqN4
+MoYBFg04hEV5kXwbGpodL6RIhEqYYZRYghyRSDgOhkAuQoFMCZJzdVqNVR8rgxU=
?>
\ No newline at end of file
diff --git a/documentation/Syntax/modules.xml b/documentation/Syntax/modules.xml
index 649dfa8..6fee31f 100644
--- a/documentation/Syntax/modules.xml
+++ b/documentation/Syntax/modules.xml
@@ -1,335 +1,408 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter version="5.1" xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:trans="http://docbook.org/ns/transclusion"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:m="http://www.w3.org/1998/Math/MathML"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:db="http://docbook.org/ns/docbook">
<?xxe-sn 26n42fz1reo 21?>
<title><?xxe-sn 26n42fz1reo 22?>Modules</title>
<para><?xxe-sn 26n42fz1reo 23?>Xreate offers <emphasis><?xxe-sn 26n42fz1reo 24?>modules</emphasis>
- as a way to organize and reuse source code. For simplicity, it's implemented
- as one file—one module.</para>
+ as a way to organize and reuse source code. For simplicity's sake, it is
+ implemented as one file — one module, with one to one correspondence.</para>
<para><?xxe-sn 26n42fz1reo 25?>Modules often require prior compilation of
- other modules for correct work. It leads to a problem of a
- <emphasis><?xxe-sn 26n42fz1reo 26?>resolution</emphasis> where required
- module is located. Especially since modern software products usually have
- complicated and volatile file structure depending on exact configuration and
- platform to build. Common practice is to rely on build configuration tools
- to provide exact path for each module.</para>
+ other modules for correct work. This leads to a problem of
+ <emphasis><?xxe-sn 26n42fz1reo 26?>resolution</emphasis> where the required
+ module is located, determine exact module's filename, especially as modern
+ software products tend to incorporate a complicated and volatile file
+ structure depending on configuration and platform to build. The common
+ practice is to rely on build configuration tools to provide exact path to
+ each module.</para>
+
+ <remark><?xxe-sn 26r2dlt35rk pu35zrt1abya?>Не вполне понимаю смысл фразы "a
+ resolution where the required module is located". Принятие решения о том,
+ где будет располагаться какой модуль? Тогда может лучше будет так: "This
+ leads to a problem of resolution where to locate which module". Как в этом
+ примере: "Therefore tools for choosing where to locate which types of
+ production like this method will become increasingly useful". Или выяснение
+ того, где находится нужный модуль?</remark>
<para><?xxe-sn 26n42fz1reo 27?>For this reason Xreate interferes as little
- as possible with resolution. Language does not support for module to
- directly specify any path be it relative or absolute of other required
- modules. Also compiler does not search modules in some predefined list of
- directories and does not assume anything about project's file structure. It
- expects resolution information already fully defined before
- compilation.</para>
-
- <para><?xxe-sn 26n42fz1reo 28?>However compiler has optional built-in
- functionality to facilitate resolution. It is the very kind of problems the
- transcend level suited excellently for. It is modeled as <emphasis><?xxe-sn 26n42fz1reo 29?>supply
- and demand</emphasis> approach and lets modules to declare what they
- <emphasis><?xxe-sn 26n42fz1reo 2a?>provide</emphasis> and what
- <emphasis><?xxe-sn 26n42fz1reo 2b?>require</emphasis> expressed by
- annotations. Compiler then tries to satisfy requirements and find a match.
- Alternatively, external tools always can be used.</para>
+ as possible with the resolution. The language does not allow for a module to
+ specify a path directly, be it a relative or an absolute path in respect to
+ other required modules. Also the compiler does not search for modules in any
+ predefined list of directories, and does not assume anything about project's
+ file structure. It expects the resolution information to have been already
+ fully predefined before the start of the compilation process.</para>
+
+ <remark><?xxe-sn 26r2dlt35rk pu35zrt1abyb?>1. Если resolution - это процесс,
+ то перед словами обозначающими какой-либо процесс, как правило, артикли не
+ ставятся (исключение - если речь идет о каком-то конкретном процессе,
+ например, "Dune2: The building of a dynasty"). А неопределенный артикль
+ совершенно исключен в этом случае. 2. "The language does not support for a
+ module" - возможные варианты замены: "The language offers no instruments
+ allowing a module to...", "The language has no means allowing a module
+ to...". 3. "Does not search for modules in some..." - в вопросительных
+ предложениях и при отрицании употребляется местоимение "any" вместо
+ "some".</remark>
+
+ <para><?xxe-sn 26n42fz1reo 28?>However, the compiler features some optional
+ built-in functionality to facilitate resolution. It is the very type of a
+ problem the transcend level is excellently suited for. It is modeled after a
+ <emphasis><?xxe-sn 26n42fz1reo 29?>supply and demand</emphasis> approach and
+ lets modules to declare what they <emphasis><?xxe-sn 26n42fz1reo 2a?>provide</emphasis>
+ and what they <emphasis><?xxe-sn 26n42fz1reo 2b?>require</emphasis>,
+ expressed by annotations. Compiler then tries to satisfy the requirements
+ and find a match. Alternatively, external tools can always be used.</para>
<section>
<?xxe-sn 26n42fz1reo 2c?>
<title><?xxe-sn 26n42fz1reo 2d?>Module Headers</title>
<synopsis><?xxe-sn 26n42fz1reo 2e?>SYNTAX:
**module** [:: //annotations-list// ] (Full form)
{
//module-statement//...
}</synopsis>
<synopsis><?xxe-sn 26n42fz1reo 2f?>**module** :: //annotations-list// . (Simplified form)</synopsis>
<synopsis><?xxe-sn 26n42fz1reo 2g?>//module-statement// ::=
| **require** ( //annotation// ). (1)
| **discover** ( //path// ). (2)
| **controller** (//path//). (3)</synopsis>
<itemizedlist>
<?xxe-sn 26n42fz1reo 2h?>
<listitem>
<?xxe-sn 26n42fz1reo 2i?>
<para><?xxe-sn 26n42fz1reo 2j?><code><?xxe-sn 26n42fz1reo 2k?>annotations-list</code>
List of annotations delimited by semicolon</para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo 2l?>
<para><?xxe-sn 26n42fz1reo 2m?><code><?xxe-sn 26n42fz1reo 2n?>annotation</code>
Any valid transcend expression</para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo 2o?>
<para><?xxe-sn 26n42fz1reo 2p?><code><?xxe-sn 26n42fz1reo 2q?>path</code>
Absolute or relative path to controller</para>
</listitem>
</itemizedlist>
- <para><?xxe-sn 26n42fz1reo 2r?>Xreate recognizes number of module
- management statements. Those statements should be located in specific
+ <para><?xxe-sn 26n42fz1reo 2r?>Xreate recognizes a number of module
+ management statements. Those statements should be located in a specific
section <code><?xxe-sn 26n42fz1reo 2s?>module {...}</code> of a source
code which is called <emphasis><?xxe-sn 26n42fz1reo 2t?>module
header</emphasis>. Module can have several headers. All headers gathered
- from a whole file are combined into one before actual processing.</para>
+ from a single file are combined into one before actual processing.</para>
<note>
<?xxe-sn 26n42fz1reo 2u?>
- <para><?xxe-sn 26n42fz1reo 2v?>Modules processing happens before
- compilation. It means any data produced in course of compilation is
- inaccessible at this stage</para>
+ <para><?xxe-sn 26n42fz1reo 2v?>Modules' processing happens before
+ compilation. This means that any data produced in course of compilation
+ is inaccessible at this stage</para>
</note>
</section>
<section>
<?xxe-sn 26n42fz1reo 2w?>
<title><?xxe-sn 26n42fz1reo 2x?>Requesting Modules</title>
<para><?xxe-sn 26n42fz1reo 2y?>Statement <code><?xxe-sn 26n42fz1reo 2z?>require(..)</code>
expresses which modules are required for correct compilation.</para>
<programlisting xml:id="Requesting_Modules_1"><?xxe-sn 26n42fz1reo 30?>name="tests/modules.cpp: Modules.Doc_Requesting_Modules_1"
module {
require(logger).
}</programlisting>
- <para><?xxe-sn 26n42fz1reo 31?>In this example module in question requires
- some other module that <emphasis><?xxe-sn 26n42fz1reo 32?>provides</emphasis>
- feature called <code><?xxe-sn 26n42fz1reo 33?>logger</code>. There is no
- way to specify direct external module location. Instead, module expresses
- requirement in abstract form as propositional expression which is later
- used by resolution to find exact match.</para>
+ <para><?xxe-sn 26n42fz1reo 31?>In this example a module in question
+ requires some other module that <emphasis><?xxe-sn 26n42fz1reo 32?>provides</emphasis>
+ a feature called <code><?xxe-sn 26n42fz1reo 33?>logger</code>. There is no
+ way to specify the direct location of the external module. Instead, the
+ "main" module expresses a requirement in an abstract form as a
+ propositional expression which is later used by the resolution to find the
+ exact match.</para>
<programlisting xml:id="Requesting_Modules_2"><?xxe-sn 26n42fz1reo 34?>name="tests/modules.cpp: Modules.Doc_Requesting_Modules_2"
module{require(stringslib).}
processString = function(a:: string):: string
{
someStrFunc(a)
}
module{require(mathlib).}
processNumber = function(a:: num):: num
{
someMathFunc(a)
}</programlisting>
- <para><?xxe-sn 26n42fz1reo 35?>Example above demonstrates using several
- headers in one file. It's particularly useful if developer finds it
- convenient to put requirements near the actual code that uses it. This way
- it can be easily spotted when requirements are no more needed. After all,
- code locality improves readability.</para>
+ <para><?xxe-sn 26n42fz1reo 35?>The above example demonstrates usage of
+ several headers in one file. It is particularly useful in situations where
+ a developer finds it convenient to place requirements beside the actual
+ code that uses them. This way one can easily spot the requirements that
+ are no more needed. After all, code locality improves readability.</para>
</section>
<section>
<?xxe-sn 26n42fz1reo 36?>
<title><?xxe-sn 26n42fz1reo 37?>Module Annotations</title>
- <para><?xxe-sn 26n42fz1reo 38?>Module can declare additional information
- for various uses. This is expressed by annotations located in the header.
- They are called module annotations. For instance, module annotations can
- be used by module resolution to find modules that satisfy requirements of
- others.</para>
+ <para><?xxe-sn 26n42fz1reo 38?>A module can declare an additional
+ information for various uses. This is expressed by annotations located in
+ the header. They are called 'module annotations'. For instance, module
+ annotations can be used by module resolution to find modules that satisfy
+ requirements of other modules.</para>
<programlisting xml:id="ModuleAnnotations_1"><?xxe-sn 26n42fz1reo 39?>name="tests/modules.cpp: Modules.Doc_ModuleAnnotations_1"
module:: status(obsolete).</programlisting>
- <para><?xxe-sn 26n42fz1reo 3a?>The example shows module that declares its
- status. It can be used by resolution to choose most appropriate module out
- of number of candidates. One way to view annotations used by resolution is
- to treat them as something that module <emphasis><?xxe-sn 26n42fz1reo 3b?>provides</emphasis>.</para>
+ <para><?xxe-sn 26n42fz1reo 3a?>The example shows a module that declares
+ its status. It can be used by resolution to select the most appropriate
+ module out of a number of candidates. One way to view annotations used by
+ resolution is to treat them as something that module <emphasis><?xxe-sn 26n42fz1reo 3b?>provides</emphasis>.</para>
<note>
<?xxe-sn 26n42fz1reo 3c?>
<para><?xxe-sn 26n42fz1reo 3d?>There are no predefined module
- annotations and developer can put arbitrary information there.</para>
+ annotations, and developers can place arbitrary information
+ there.</para>
</note>
</section>
<section>
<?xxe-sn 26n42fz1reo 3e?>
<title><?xxe-sn 26n42fz1reo 3f?>Modules Resolution</title>
<para><?xxe-sn 26n42fz1reo 3g?>Modules resolution is a process to find
- exact modules locations that match requests. Compiler does not search
- modules in predefined directories and does not assume anything about
- project's file structure. In order to allow developer to determine it
- themselves the compiler refers to two transcend tables</para>
+ exact modules' locations that match requests. Compiler does not perform a
+ search of modules in any predefined directories, and it does not assume
+ anything about project's file structure. Compiler, in order to allow a
+ developer to determine it independently, refers to two transcend
+ tables:</para>
+
+ <remark><?xxe-sn 26r2dlt35rk pu35zrt1abyd?>Вот я и дошел до ответа что
+ такое resolution :) Оставляю предыдущие комменты для истории.</remark>
<synopsis><?xxe-sn 26n42fz1reo 3h?>SYNTAX:
**modules_resolution**(//request//, //module-resolved//). (1)
**modules_resolution**(//request//, //module-resolved//, //module-context//). (2)</synopsis>
<itemizedlist>
<?xxe-sn 26n42fz1reo 3i?>
<listitem>
<?xxe-sn 26n42fz1reo 3j?>
<para><?xxe-sn 26n42fz1reo 3k?><emphasis><?xxe-sn 26n42fz1reo 3l?>request</emphasis>
annotation used in statement <code><?xxe-sn 26n42fz1reo 3m?>request(...)</code></para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo 3n?>
<para><?xxe-sn 26n42fz1reo 3o?><emphasis><?xxe-sn 26n42fz1reo 3p?>module-resolved</emphasis>
Path or identifier of a module that matches request</para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo 3q?>
<para><?xxe-sn 26n42fz1reo 3r?><emphasis><?xxe-sn 26n42fz1reo 3s?>module-context</emphasis>
Path or identifier of a module that requires other module</para>
</listitem>
</itemizedlist>
<para><?xxe-sn 26n42fz1reo 3t?>These tables contain resolved modules for
all possible requests. Form (1) contains requests that should always be
- resolved to the same module. Form (2) contains such requests for which
- resolution depends on requesting module <emphasis><?xxe-sn 26n42fz1reo 3u?>module-context</emphasis>.</para>
+ resolved to the same module regardless of where module is requested. Form
+ (2) contains such requests for which resolution depends on requester
+ <emphasis><?xxe-sn 26n42fz1reo 3u?>module-context</emphasis>. In other
+ words, difference between forms (1) and (2) is that form (2) takes into
+ account not only <emphasis><?xxe-sn 2be3ap8an7k 1?>what</emphasis>(parameter
+ <code><?xxe-sn 2be3ap8an7k 2?>request</code>) is requested but also
+ <emphasis><?xxe-sn 2be3ap8an7k 5?>where from</emphasis>(parameter
+ <code><?xxe-sn 2be3ap8an7k 4?>module-context</code>) it is
+ requested.</para>
<programlisting xml:id="ModulesResolution_1"><?xxe-sn 26n42fz1reo 3v?>name="tests/modules.cpp: Modules.Doc_ModulesResolution_1"
modules_resolution(numlib, "/path/to/numlib").
modules_resolution(strings, "/path/to/ansi-lib", "moduleA").
modules_resolution(strings, "/path/to/utf8-lib", "moduleB"). </programlisting>
- <para><?xxe-sn 26n42fz1reo 3w?>For the example above the compiler would
- always resolve path to numerical lib(<code><?xxe-sn 26n42fz1reo 3x?>numlib</code>)
- as "/path/to/numlib" (line 1). However <code><?xxe-sn 26n42fz1reo 3y?>strings</code>
+ <para><?xxe-sn 26n42fz1reo 3w?>In the above example, compiler would always
+ resolve a path to numerical lib(<code><?xxe-sn 26n42fz1reo 3x?>numlib</code>)
+ as "/path/to/numlib" (line 1). However, <code><?xxe-sn 26n42fz1reo 3y?>strings</code>
library would be resolved as "/path/to/ansi-lib" if requested in
- <code><?xxe-sn 26n42fz1reo 3z?>moduleA</code>(line 2) and as
- "/path/to/utf8-lib" if requested in <code><?xxe-sn 26n42fz1reo 40?>moduleB</code>(line
- 3).</para>
+ <code><?xxe-sn 26n42fz1reo 3z?>moduleA</code> (line 2) and as
+ "/path/to/utf8-lib" if requested in <code><?xxe-sn 26n42fz1reo 40?>moduleB</code>
+ (line 3).</para>
- <para><?xxe-sn 26n42fz1reo 41?>When compiler encounters module request it
- looks up table <code><?xxe-sn 26n42fz1reo 42?>modules_resolution</code>
- (first or second form) to find path of the requested module. Tables can be
- populated by any means be it either transcend reasoning or external
- tools.</para>
+ <para><?xxe-sn 26n42fz1reo 41?>When compiler encounters a module request,
+ it looks up a <code><?xxe-sn 26n42fz1reo 42?>modules_resolution</code>
+ table (either the first or the second one) to find the path to the
+ requested module. Tables can be populated by any means, be it transcend
+ reasoning or any external tools.</para>
<note>
<?xxe-sn 26n42fz1reo 43?>
<para><?xxe-sn 26n42fz1reo 44?>There is no defined order or priority or
fall back behavior while looking into tables. If the same request occurs
in both tables they are considered to be ill-formed</para>
</note>
</section>
<section>
<?xxe-sn 26n42fz1reo 45?>
- <title><?xxe-sn 26n42fz1reo 46?>Advanced Modules Resolution</title>
+ <title><?xxe-sn 26n42fz1reo 46?>Advanced Modules' Resolution</title>
- <para><?xxe-sn 26n42fz1reo 47?>Xreate provide additional layer, optional
- helper to simplify modules management. It introduces two more built-in
- statements that can be used in module header: <emphasis><?xxe-sn 26n42fz1reo 48?>Discover</emphasis>
- statement and <emphasis><?xxe-sn 26n42fz1reo 49?>Controller</emphasis>
- Statement.</para>
+ <para><?xxe-sn 26n42fz1reo 47?>Xreate provides an additional layer – an
+ optional helper, to simplify modules management. It introduces two more
+ built-in statements that can be used in the module's header:
+ <emphasis><?xxe-sn 26n42fz1reo 48?>Discover</emphasis> Statement and
+ <emphasis><?xxe-sn 26n42fz1reo 49?>Controller</emphasis> Statement.</para>
<itemizedlist>
<?xxe-sn 26n42fz1reo 4a?>
<listitem>
<?xxe-sn 26n42fz1reo 4b?>
<para><?xxe-sn 26n42fz1reo 4c?><emphasis><?xxe-sn 26n42fz1reo 4d?>Discover
- Statement</emphasis> has the form <code><?xxe-sn 26n42fz1reo 4e?>discover
- (<emphasis><?xxe-sn 26n42fz1reo 4f?>path</emphasis>)</code>.It allows
- to specify directory where compiler would recursively search for all
- xreate files and extract module header annotations. It gathers info
- about all found source files.</para>
+ Statement</emphasis> is presented in the form <code><?xxe-sn 26n42fz1reo 4e?>discover
+ (<emphasis><?xxe-sn 26n42fz1reo 4f?>path</emphasis>)</code>. It allows
+ to specify a directory within which compiler would recursively search
+ for all Xreate files and extract module header annotations. It gathers
+ information about all found source files.</para>
</listitem>
<listitem>
<?xxe-sn 26n42fz1reo 4g?>
<para><?xxe-sn 26n42fz1reo 4h?><emphasis><?xxe-sn 26n42fz1reo 4i?>Controller
- Statement</emphasis> has the form <code><?xxe-sn 26n42fz1reo 4j?>controller
+ Statement</emphasis> is presented in the form <code><?xxe-sn 26n42fz1reo 4j?>controller
(<emphasis><?xxe-sn 26n42fz1reo 4k?>path</emphasis>)</code> and
- specifies path to modules resolution controller. Controller is a file
- that contains transcend rules in order to process data gathered by
- discovery and populate resolution tables as its result of work.</para>
+ specifies a path to the modules' resolution controller. Controller is
+ a file that contains transcend rules in order to process data gathered
+ by discovery and populate resolution tables as a result of its
+ work.</para>
</listitem>
</itemizedlist>
- <para><?xxe-sn 26n42fz1reo 4l?>Example below shows 3 modules:</para>
+ <para><?xxe-sn 26n42fz1reo 4l?>The below example shows 3 modules:</para>
<programlisting xml:id="AdvModRes_1"><?xxe-sn 26n42fz1reo 4m?>name="tests/modules.cpp: Modules.Doc_AdvModRes_1"
-
//First Module
module::
- name(testA);
- provide(superService);
- status(needToTestEvenMore).
+ name(testA);
+ provide(superService);
+ status(needToTestEvenMore).
//Second Module
module::
- name(testB);
- provide(superService);
- status(needToTest).
+ name(testB);
+ provide(superService);
+ status(needToTest).
//Third Module
module {
- require(superService).
- discover("/modules/path/").
- controller("/path/to/controller").
+ require(superService).
+ discover("/modules/path/").
+ controller("/path/to/controller").
}</programlisting>
- <para><?xxe-sn 26n42fz1reo 4n?>Two modules offer the same feature
- <code><?xxe-sn 26n42fz1reo 4o?>provide(superSerivce)</code>. Third module
- requires it and specifies directory where to look up for needed files.
- Controller's task is to populate resolution table if needed module is
- found and choose appropriate candidate, if more than one module offer this
- service.</para>
+ <para><?xxe-sn 26n42fz1reo 4n?>Two of the modules offer the same feature
+ <code><?xxe-sn 26n42fz1reo 4o?>provide(superSerivce)</code>. The third
+ module requires it and specifies a directory in which to look for needed
+ files. The controller's task is to populate the resolution table if the
+ necessary module is found, and also to choose the appropriate candidate,
+ if more than one module offer this service.</para>
<para><?xxe-sn 26n42fz1reo 4p?>One way to decide what to choose in this
- example is to look at status of both modules. Let score be assigned to
- each possible status. Let's say <code><?xxe-sn 26n42fz1reo 4q?>0</code>
- for <code><?xxe-sn 26n42fz1reo 4r?>status(needToTestEvenMore)</code>,
+ example is to look at the status of both modules. Let a score be assigned
+ to each possible status, e.g. <code><?xxe-sn 26n42fz1reo 4q?>0</code> for
+ <code><?xxe-sn 26n42fz1reo 4r?>status(needToTestEvenMore)</code> and
<code><?xxe-sn 26n42fz1reo 4s?>1</code> for <code><?xxe-sn 26n42fz1reo 4t?>status(needToTest)</code>.
- Then controller would proceed with the best scoring module,
+ The controller would then proceed with best scoring module –
<code><?xxe-sn 26n42fz1reo 4u?>Second Module</code> in this case.</para>
</section>
<section>
<?xxe-sn 26n42fz1reo 4v?>
<title><?xxe-sn 26n42fz1reo 4w?>See Also</title>
<para><?xxe-sn 26n42fz1reo 4x?>Transcend: <link
xlink:href="/w/transcend/modules-api"><?xxe-sn 26n42fz1reo 4y?>Modules
API</link></para>
</section>
</chapter>
<?xxe-revisions
-#2 2019-02-20T12:15:04Z pgess
+#5 2019-03-07T17:46:08Z pgess
+#4 2019-03-07T17:15:17Z pgess
+1sPEAAAB+GQAiBuBgFEAgQiED4J6LDmwvtC90YDRg9C60Ya0g7DRgLLRgyAoIri4Iikg0YPRh7Vy
+Y6DQsYzQtb4s0LG70LjRhyKyuSK9s9C+0J7Qv9GMuCzRgbgggbXQvC4g0K2A0LbRgCy6hii+tbGL
+j7AstLM/KWU/PiKyILggIqG+0Lmx0Yu60LLQs71mPz7QojIpMyl4b3V0cHOFFBMfryMKQzKxMwlT
+BCMNUwRTBQEBUwQBA0MEAQgTBhMEAQFTB8hDBEMFEwUBATMEUwTjYwQBBlMFAQEzBDME2c2yYwUB
+ATMoE4FKM4dgQ4xFsFOMLWMEM4svUywTKAEBMwYBAUMHMwRTBgECQwYTBFMFQwQzBAEDYwhTDxME
+EwgBAWMHAQFTB74TBUMHMwQBBSMHAQFTBVMEsAECEw0jBVMEpCMEAQNjBQEEEwQBAoMEQwQBApMF
+kwmDBGMXkwpzBYMHQwVjDSMFEwUBAmMOUwWDBMwzBgEBIwSTBRMEAQeDBWMFIwRDBXMFEwYTBAED
+QwSTBXMEAQIzBIMEIwsBAUMFIwUjBgEBIwRDBTMGAQFzBJMTAQEzFyMEIwX4QwQTBa9jBnMFUwVT
+BmMEQwRjBxMF4MgTCgEBgwaDBCMEMwVTBDMFAQJDCGMGgwewrwECEwxjKWObVjNJMwRDDVMhQx4T
+MQEEMzpzBZMEQwZDBEMKMwQjBCMFoyMEIwS8kwQBAzMbEwQBARMKIwYBAyMIUw3NEwZjBOAzBGMF
+MwyDBCMHIwRTBCMJEwqDBMBjEYMEMw1DBCMHIwQTBQECIwcBAVMEEw0zFhMHMwozG1ODNEMJYx0z
+gQMzBmNdQxKDKAEFcwRjC2MGIwRDBCMEUwmTBgECMwSTBgECgydDiwEBAWOERDMFMwQBBBMGM411
+AIUbn26Le4RZuAVgj05TjkWCNoc+rkeLMIoxJoxCiFKBMoo3gUCDeoQSaYYPQgEFhRk+hQ4LhhCB
+bYdkryWMSow1jC+LM4l+iTuDNIRfr3+BG4tkgSKFDyOIV4NllSOTfJlXk2aCSItuiVevCWSDYxUG
+i3cxgW+LKLASi26LHcWvdMlUIplQDZldkmOHVYIJi2iIdxRZgQWFALE+4JRXM4MXgluBPceWV5Uy
+gQ6wrohwSYErrS6CArJ2sxYTBIE3iR2BbWyzFYIsi1azWifeiRyyQi1LI5RShSVYi3kgWQeEYVwv
+AaxqxbRZc452mXKFLJt+f5EIlkNtiXWDWpk3jCGLNYJZgRbSNKBqjB6hPqITh3jhiD2LEopMolWj
+Tn5qizeCXIEIgxqIKmReoRmjSCs0lEcpgjeCPiaBGUeBVKRVlkjVATGOdZhvg2STbyiSBJcFgjeD
+W4MqgQpe/uyEXYMUrDCKVg+GYFStLlR1gkaLAo9djQq/ZoRT
+
+#3 2018-12-16T14:37:25Z Acer2
+1sPEAAABgYBRAEH+OwABJBYgc7ELE4obIwZDiCZjlyABAVMIMygjFRMHUyODFXMHQ5YwM4wNALFG
+xDiKXIhgg2aXYTG8K0LDKz2WYg==
+#2 2018-12-14T15:41:37Z Acer2
+1sPEAAAB/jsAghD8cQANgRdlLGF1bEV1cCdzIHNheXPMUBMLQx9TmFZTMGMSUwxDBQEBYxAzYEMG
+Q0ITClMEY4F8EwRTcTMVEwZDBVMFY21DgTtzBJMmU1tjCIMIYwtDgQ0BAWMEIwWnEwVDFVMrMwQB
+AWMHMwZDBlODRYNgQyUjEFMIAQJTExMKQxeTFBMGMxAjBRMFU4ErQxxTKVMFAQZjcRMeQ1EjDFMH
+Yw1DBFMTgx4zgjIAhxuZf6wupzyZB59kIgwRjhts0EB7UJlTggxykTMd0lgRdNNWgXHDN6mBYX12
+gR/FGIgKn1iBQawpk3gIhw8UqWSKHYJlQe9kIYq/HyGOII5HJ4EvHhYv3XaBEoskOWiaTg32NA==
#1 2018-12-12T21:49:18Z pgess
-1sPEAAAB41YAZ+FRAAE8JCBzoWsThB8jBkOHeGOSBwEBUwgzKCMVEwdTI3MVgwdDlFkzGkMRUxtj
-OpMLMwaTG1MxEwpjDSMEMyAziUUAoiauc4RgiDKDQJJIMacPQuWPPZUMGA8ZI0MyHaIvCpZrSB4=
-
+1sPEAAAB/HIAhU7hUQAogwuCEyfigJRJdC4gRXNpbmN1c3VDTGt3aG9JdCdmdXMgbmVhaXR3aXNl
+bChzhRgBARMZAQNDFBMcU04BAjMXQyNDIFMHYxMBA0MKAQQjBVMW2jMFIwQzMTMGMyUBAVNNQwRD
+FYMcQ0wBAWMdIwYzBWMHEwpjBBMEYwZjDTMIQwmTB0MQgwkzEFMPUx9jBjNDUxdjDhMIMxMjCTMm
+IwoTBDNJ3xMGEwQjBjMKQwZDB0MMUxQTIzOBEVM3YxljIUM9UwdTBGOJNkNOIwZTgV0BAzOBBkMo
+AQITCFOECzNsYwdDUyMGYxATBlMGQwiDBjMLUxBjEDNDQxVTgjEjCGMGQw9jBFMfAQEzFwEBQyMB
+AVMJEwQBBWMGUxYBAlMHEwQzBCMGQwv8MwRzDmOBUxMGYw5DcIMGMw5TdEOBL1NBEwUjBGMdU4Ia
+kwczCCMEIwRDgWszMhMHgwgBAVMEUwljSjMRYxpDBM0TDTMekwljHzOIb2MGUyJjJ1OCKBMEYwQz
+CVMFgw1jFUNsU4IWYziDBjMJMwxDBmM7AQFDCVMHEwUzCWMFMwdDNlMHYwgzFhMOQwozG2OZWQCF
+Gh6DdYILUpUjOJIzKxaNdBAFiiaoNzCBHTEqpTkO9YU0iACTGLJogQiRJIEGinIJCBCxHesoHR2H
+eCKDUSZHJJJBmW2MfYgIggCZVEODYI5tiCSgfKtKjhUVCQeEID2BFqI/USVBPQeJOq0qVoFhgQeZ
+WjmEDYIxdZlXbYkDk0sTCRkNExJHhWy0NoI1Dm4WISuVMIUhoGBAgmKEX7k3mBZco0GXNucjg2SB
+WxEJm1KBBnuBMY5IjGROH+SgJIhHiQuJTYFskiQJgWUclDO2cBOsG2ubfilThR2BRqcOkQSJHYNH
+hQagLKxdizP+nxAXbYMNCYNoSoFeDk0Non6RaaVXkEutJgSuCD+gFYILjEtN
?>
\ No newline at end of file

Event Timeline